当前位置: 首页 > news >正文

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题

1、问题描述

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。
比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

2、思路

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能
数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:
1. 用数据集合中前K个元素来建堆
前k个最大的元素,则建小堆
前k个最小的元素,则建大堆
2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素
将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

3、代码实现

首先通过文件函数生成100000个数据:
 

void CreateNDate()
{// 造数据int n = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand() + i) % 10000000;fprintf(fin, "%d\n", x);}fclose(fin);
}

在前面我们了解到若为向下建堆则为O(N);而向上建堆为O(N*logN);所以我们在这采用向下建堆:

void AdjustDown(HPDataType* a, int n, int parent)
{// 先假设左孩子小int child = parent * 2 + 1;while (child < n)  // child >= n说明孩子不存在,调整到叶子了{// 找出小的那个孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void TestHeap3()
{int k;printf("请输入k>:");scanf("%d", &k);int* kminheap = (int*)malloc(sizeof(int) * k);//开辟空间if (kminheap == NULL){perror("malloc fail");return;}const char* file = "data.txt";//打开我们刚刚创建的文件FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}// 读取文件中前k个数for (int i = 0; i < k; i++){fscanf(fout, "%d", &kminheap[i]);}// 建K个数的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(kminheap, k, i);}// 读取剩下的N-K个数int x = 0;while (fscanf(fout, "%d", &x) > 0){if (x > kminheap[0]){kminheap[0] = x;//堆顶数据始终是最小的不可能出现卡住数据进不去问题AdjustDown(kminheap, k, 0);}}printf("最大前%d个数:", k);for (int i = 0; i < k; i++){printf("%d ", kminheap[i]);}printf("\n");
}

二、二叉树的三种层序遍历

以下三种遍历,如果树的深度太深就会栈溢出。

1、二叉树前序遍历

void PreOrder(BTNode* root)
{if (root == NULL){printf(" null ");return;}printf("%d ", root->_data);PreOrder(root->_left);PreOrder(root->_right);
}

递归调用图:

剩下的两种遍历流程图与其类似,这里不做详细图解。 

2、二叉树中序遍历

// 二叉树中序遍历
void InOrder(BTNode* root)
{if (root == NULL){printf(" null ");return;}InOrder(root->_left);printf("%d ", root->_data);InOrder(root->_right);
}

3、二叉树的后序遍历 

// 二叉树后序遍历
void PostOrder(BTNode* root)
{if (root == NULL){printf(" null ");return;}PostOrder(root->_left);PostOrder(root->_right);printf("%d ", root->_data);
}

三、树相关的计算

1、节点数的计算

节点数的计算可分为左树+右树 +1;

int treesize(BTNode* root)
{if (root == NULL) {return 0;}return treesize(root->_left) + treesize(root->_right);
}

2、叶字节点数

为空,叶为0,非空为左叶子数+右叶子数,结束条件为该节点左右两个子节点为空,或者该节点为空

int treeleaf(BTNode* root)
{if (root == NULL){return 0;}if (root->_left == NULL && root->_right == NULL){return 1;}return treeleaf(root->_left) + treeleaf(root->_right);
}

3、深度

若为空则高度为0,非空为左数高度与右数高度大的那一个

int treeleafhigh(BTNode* root)
{if (root == NULL){return 0;}int lefthigh = treeleafhigh(root->_left) + 1;int righthigh = treeleafhigh(root->_right) + 1;if (lefthigh > righthigh){return lefthigh;}else{return righthigh;}
}

相关文章:

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题&#xff0c;能想到的最简单直接的…...

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…...

设计模式 17 组合模式 Composite Pattern

设计模式 17 组合模式 Composite Pattern 1.定义 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设…...

【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档

这篇发表于2020 WWW 上的会议论文&#xff0c;提出一种MNS方式的负样本采样方法。众所周知&#xff0c;MF方法难以解决冷启动问题&#xff0c;于是进化出双塔模型&#xff0c;但是以双塔模型为基础的召回模型的好坏十分依赖负样本的选取。为了解决Batch内负样本带来的选择性偏差…...

串行低功耗芯片间媒体总线(SLIMbus)介绍

文章目录 SLIMbus简介slimbus设备和设备类Manager DeviceFramer DeviceInterface DeviceGeneric Device (Function)SLIMbus组件简单的SLIMbus组件复杂的SLIMbus组件SLIMbus的DATA和CLKSLIMbus的Clock Frequencies和GearsCells, Slots, Subframes, Frames, and...

esp32-S3 使用自带的大模型,实现本地文字转语言tts

目录 CMakeLists.txt文件中: 初始化以及实际运用代码: 在partitions.csv 内存分配文件中,添加voice_data项...

Redis事务(1)

什么是事务&#xff1f; Redis 的事务和 MySQL 的事务概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执行。 但是注意体会 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: redis 没有 “回滚机制”. 只能做到这些操作 “批量执⾏”. 不能做到 “⼀个失败就…...

202206青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 有如下 Python 程序, 包含 lambda 函数, 运行该程序后, 输出的结果是? ( ) g = lambda x,y:x*yprint(g(2,3))A :2 B :3 C :6 D :8 正确答案:C 试题解析: g = lambda x, y: x*y, lambda 函数返回参数 x 和 y 的积, 因此选 C。 第 2 题 【单选…...

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 &#xff08;1&#xff09;用户注册与用户登录 &#xff08;2&#xff09;手机搜索、手机比拼、手机个性化推荐 &#xff08;3&#xff09;点击搜索的手机图片会就用户行为&#xff0c;轮播展示用户行为&#xff0c;推荐点击次数靠前的手机 &#xff08;4&#xf…...

Leetcode 环形链表|| 快慢指针解法

但是我们不知道 aaa 的值&#xff0c;该怎么办&#xff1f;依然是使用双指针法。考虑构建一个指针&#xff0c;此指针需要有以下性质&#xff1a;此指针和 slow 一起向前走 a 步后&#xff0c;两者在入口节点重合。那么从哪里走到入口节点需要 aaa 步&#xff1f;答案是链表头节…...

出书,是「盖你自己的房子」你知道吗?

出书是「盖你自己的房子」 尊敬的出书盟友&#xff1a; 你好&#xff01;我希望这封信能够激发您对出书和阅读的热情。 在当今信息爆炸的时代&#xff0c;每个人都有机会分享自己的故事、思想和知识。而书籍作为一种流传百年的媒体&#xff0c;依旧承载着无限的力量和影响力…...

深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥

系列文章目录 更新ing... MySQL操作全攻略&#xff1a;库、表、数据、事务全面指南深入探索MySQL SELECT查询&#xff1a;从基础到高级&#xff0c;解锁数据宝藏的密钥MySQL SELECT查询实战&#xff1a;练习题精选&#xff0c;提升你的数据库查询技能PyMySQL&#xff1a;连接P…...

驾校管理系统-手把手调试搭建

驾校管理系统-手把手调试搭建 驾校管理系统-手把手调试搭建...

知能行——考研数学利器

知能行使用体验全记录 首先&#xff0c;我先介绍一下自己&#xff0c;我是2018级的&#xff0c;2022年6月毕业&#xff0c;本科沈阳工业大学&#xff08;双非&#xff09;&#xff0c;今年二战&#xff0c;专业课自动控制原理&#xff0c;数二英二&#xff0c;目标是江南大学控…...

pod 库发布脚本

repo_tag.sh 文件 #!/bin/zsh# 私有库名称 #PODNAME${PWD##*/} PODNAME"LBHorizontalCenterLayout"function obtain_git_tag {# 类似 "s.version 0.0.1"VERSION_STRINGgrep -E s.version.* ${PODNAME}.podspecTAGtr -cd "[0-9.]" <<&…...

Java 8 新特性:深入理解 Lambda 表达式的强大与应用

Java 8 新特性&#xff1a;深入理解 Lambda 表达式的强大与应用 Lambda 表达式是 Java 8 引入的重要特性之一&#xff0c;它允许将匿名函数&#xff08;即无名称的函数&#xff09;作为参数传递给方法&#xff0c;简化了代码的编写&#xff0c;使代码更加简洁和易读。本文将深…...

HTML5 Canvas图形绘制技术应用

HTML5 Canvas图形绘制技术应用 目录 Canvas基础知识基本绘图操作路径操作文本绘制图像绘制变换复合图形与剪切阴影渐变动画与交互高级技巧...

JMETER工具:以录制手机app为例

JMETER工具&#xff1a;以录制手机app为例子 JMETER安装和环境配置 pc需要安装jdk&#xff0c;并进行jdk的环境配置&#xff0c;安装好jdk并配置好后&#xff0c;通过命令行输入java –version出现以下界面就表示安装成功&#xff1a; &#xff08;对应的jdk版本不可太低&…...

PDF文件权限密码保护:如何去除及解决方法

如果你忘记了PDF文件密码&#xff0c;不用担心&#xff01;PDF解密、找回密码、去除密码的方法简单易行。只需两步&#xff1a;1、打开百度搜索“密码帝官网”&#xff1b;2、在官网页面点击“立即开始”&#xff0c;上传文件&#xff0c;稍等片刻即可找回密码。这种方法安全、…...

【电子信息(工程)】电子通信创新创业教育综合

电子通信创新创业教育 阐述电磁场、电磁波和电磁频谱及应用一、电磁场 法拉第根据电流与磁场的关系,提出了电磁感应定律:如果电磁场中有处于运动状态下的闭合回路导体存在,流经该导体磁场的磁场强度和磁场量,通常都会出现相应的变化,电磁感应电流由此而产生。随后,英国的…...

OpenGL多线程踩坑实录:EGL_BAD_ACCESS错误排查与修复指南

OpenGL多线程开发中的EGL_BAD_ACCESS&#xff1a;从原理到实战解决方案 当你在深夜调试一个复杂的OpenGL多线程应用时&#xff0c;突然在终端看到EGL_BAD_ACCESS错误提示&#xff0c;那种感觉就像在高速公路上爆胎——既焦虑又无助。这个错误在多线程OpenGL开发中极为常见&…...

2024年山东联通SK-D740-C光猫超级密码破解实战指南

1. 准备工作&#xff1a;了解SK-D740-C光猫的基本信息 山东联通SK-D740-C光猫是创维为联通定制的一款千兆光猫设备&#xff0c;主要用于家庭宽带接入。这款设备默认采用路由模式&#xff0c;由运营商远程管理&#xff0c;普通用户只能使用user账户登录&#xff0c;权限非常有限…...

AI开发-python-langchain框架(--自定义Tool )挪

起因是我想在搞一些操作windows进程的事情时&#xff0c;老是需要右键以管理员身份运行&#xff0c;感觉很麻烦。就研究了一下怎么提权&#xff0c;顺手瞄了一眼Windows下用户态权限分配&#xff0c;然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

多元高斯分布:条件分布的实际应用与推导解析

1. 多元高斯分布基础回顾 第一次接触多元高斯分布时&#xff0c;我被它优雅的数学形式深深吸引。这种分布在自然界中随处可见&#xff0c;比如一群人的身高体重数据、股票市场的收益率波动&#xff0c;甚至是天气预报中的温度湿度关系。多元高斯分布就像一位全能选手&#xff0…...

建文AI录单助手 | 一键识别,秒级回填,彻底告别‘人肉录单’模式

摘要&#xff1a;建文AI录单助手以AI为引擎&#xff0c;构建“一键识别 -> 自动回填->全链贯通”的智能解决方案&#xff0c;覆盖合同、材料、签证、进度、付款、发票、结算等全业务场景&#xff0c;真正实现“人工退出、效率跃升、风险可控、秒级回填”的数字化升级&…...

[AI/应用/MCP] MCP Server/Tool 开发指南腋

简介 langchain专门用于构建LLM大语言模型&#xff0c;其中提供了大量的prompt模板&#xff0c;和组件&#xff0c;通过chain(链)的方式将流程连接起来&#xff0c;操作简单&#xff0c;开发便捷。 环境配置 安装langchain框架 pip install langchain langchain-community 其中…...

S32K3XX时钟树实战:从EB配置到外设时钟精准分配

1. S32K3XX时钟树基础&#xff1a;从晶振到外设的时钟旅程 第一次接触S32K3XX系列芯片时&#xff0c;我被它的时钟系统搞得晕头转向。直到把整个时钟链路比作城市供水系统才豁然开朗——晶振就像水源&#xff0c;PLL是增压泵&#xff0c;而七大时钟则是通往不同区域的主管道。这…...

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码)

OpenCV实战&#xff1a;SimpleBlobDetector参数调优全攻略&#xff08;附完整代码&#xff09; 在工业视觉检测和医学图像分析领域&#xff0c;斑点检测是一项基础但至关重要的任务。想象一下这样的场景&#xff1a;生产线上的零件表面缺陷检测、显微镜下的细胞计数、PCB板焊点…...

rasterizeHTML.js API完全手册:从drawHTML到drawURL的完整使用指南

rasterizeHTML.js API完全手册&#xff1a;从drawHTML到drawURL的完整使用指南 【免费下载链接】rasterizeHTML.js Renders HTML into the browsers canvas 项目地址: https://gitcode.com/gh_mirrors/ra/rasterizeHTML.js rasterizeHTML.js是一款强大的JavaScript库&am…...

快速体验Qwen3-ASR-0.6B:上传音频文件,一键识别文字

快速体验Qwen3-ASR-0.6B&#xff1a;上传音频文件&#xff0c;一键识别文字 1. 简介与快速体验 Qwen3-ASR-0.6B是一款强大的语音识别模型&#xff0c;支持52种语言和方言的识别。它基于Qwen3-Omni模型开发&#xff0c;在保持高效推理的同时&#xff0c;提供了接近商业闭源API…...