Topk问题及其二叉树遍历

  • 1.Topk问题
  • 2.二叉树的前序,中序,后序
  • 3.求二叉树的个数(TreeSize)。
  • 4.求二叉树的最大深度(maxDepth)。
  • 5.求二叉树的第K层的节点个数(TreeKLevel)。
  • 6.查找二叉树的节点(FindNode)。
  • 7.判断两棵树是否相同(isSameTree)。

1.Topk问题

 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。
 1.用数据集合中前K个元素来建堆。
 前k个最大的元素,则建小堆
 前k个最小的元素,则建大堆

Alt

 思路解答:假设求1亿个数中,前10个最大值。则建成10个数的小堆,剩余数与堆头数据比较,若比堆头数据大,则交换,向下调整成堆,小一点的数又排到对头,进行筛选,相当于建立了一个装载10个数的漏斗,进行筛选。

void CreatData()
{// 造数据int n = 100000;srand((unsigned int)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) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);
}void topk()
{printf("请输入k:>");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);}// 建k个数据的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minheap, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 读取剩余数据,比堆顶的值大,就替换他进堆if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}fclose(fout);}

 时间复杂度:建立K个数的堆,建堆时间复杂度:O(k),向下调整整成堆的时间复杂度:(N-k)* log ⁡ 2 k . , \log_2 k., log2k.,则,合起来就是O(N) = O(k+(N-k) * log ⁡ 2 k \log_2 k log2k )。

2.二叉树的前序,中序,后序

  二叉树的遍历,因为树不是线性结构,可以划分成子问题来求解,根据递归先后顺序不同,可以分为以下三种遍历顺序。
  前序:根、左子树、右子树
  中序:左子树、根、右子树
  后序:左子树、右子树、根
Alt
 再次说明一下,二叉树数是要依靠递归遍历的,根据遍历的顺序不同,分为三种情况。
 上面二叉树的前序遍历如下。
1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL
 代码如下:

typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;int val;
}BTNode;BTNode* BuyNode(int x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->left = newnode->right = NULL;newnode->val = x;return newnode;
}BTNode* CreatTree()
{BTNode* n1 = BuyNode(1);BTNode* n2 = BuyNode(2);BTNode* n3 = BuyNode(3);BTNode* n4 = BuyNode(4);BTNode* n5 = BuyNode(5);BTNode* n6 = BuyNode(6);n1->left = n2;n1->right = n4;n2->left = n3;n4->left = n5;n4->right = n6;return n1;
}void PreOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}

 因为是递归写的,刚学习不好理解。从大的层面来讲,先遍历根,在遍历左子树,在遍历右子树。
写好递归就两个条件:
<1>递归子问题
<2>返回条件
上面前序的遍历,遇到NULL就返回,因为走到头了,先访问根,在访问左子树,右子树。就整个遍历完了。

 递归展开图如下。
Alt

 在从代码执行的角度来理解,画递归展开图。
Alt

 中序遍历如下:
NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL

void InOrder(BTNode* root)
{if (root == NULL){printf("NULL");return;}InOrder(root->left);printf("%d ",root->val);InOrder(root->right);
}

 后序遍历如下:
NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1\

void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}

Alt

3.求二叉树的个数(TreeSize)。


<1>递归子问题:左子树的个数+右子树的个数+1(本身的个数)
<2>返回条件:遇到 NULL,结束,返回0

int TreeSize(BTNode* root)
{if (root == NULL)return 0;return TreeSize(root->left) + TreeSize(root->right) + 1;
}

4.求二叉树的最大深度(maxDepth)。


<1>递归子问题:左子树的高度和右子树的高度比较,取最大的,然后加自身的高度。(本身的个数)
<2>返回条件:遇到 NULL,结束,返回0

int  maxDepth(BTNode* root)
{if (root == NULL )return 0;int LeftDepth = maxDepth(root->left);int RightDepth = maxDepth(root->right);return LeftDepth > RightDepth ? LeftDepth + 1 : RightDepth + 1;
}

5.求二叉树的第K层的节点个数(TreeKLevel)。


<1>递归子问题:当前的第k层的个数 = 左子树的k-1层个数+右子树的k-1层个数
<2>返回条件:遇到NULL 返回0;不为NULL,k== 1,则就是要找的这一层的节点,返回1。

int TreeKLevel(BTNode* root,int k)
{if (root == NULL)return 0;if (k == 1)return 1;return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

6.查找二叉树的节点(FindNode)。


<1>递归子问题:先去左子树找,找不到,再去右子树找
<2>返回条件:为NULL,返回,NULL;找到,则返回节点地址。

BTNode* TreeFind(BTNode* root,int x)
{if (root == NULL)return NULL;if (root->val == x)return root;//找节点BTNode* leftNode = TreeFind(root->left, x);if (leftNode)return leftNode;BTNode* rightNode = TreeFind(root->right, x);if (rightNode)return rightNode;return NULL;
}

 这个问题比上面的递归复杂一些,画递归展开图来理解找到钱目标值,怎么一步一步返回上去。
Alt

7.判断两棵树是否相同(isSameTree)。


<1>递归子问题:比较根,左,右子树是否相同
<2>返回条件:两棵树,同时遍历,都为NULL,True;其中一个不为NULL,false,两个比较的数不相等,直接false.

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p == NULL && q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return isSameTree(p->right,q->right) && isSameTree(p->left,q->left);
}

 完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86519.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86519.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86519.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI+实时计算如何赋能金融系统?DolphinDB 在国泰君安期货年度中期策略会的演讲

6月25日&#xff0c;国泰君安期货2025年度中期策略会在上海顺利开幕。本次策略会以“观势明变&#xff0c;本固枝荣”为主题&#xff0c;特邀15位重量级行业嘉宾和52位明星分析师发表精彩观点&#xff0c;DolphinDB 受邀出席会议并作主题演讲。 实时计算如何赋能量化投研交易 …

PHP Protobuf 手写生成器,

✅ 以下是一个纯 PHP 编写的通用 Protobuf 二进制生成器&#xff0c;支持&#xff1a; varint fixed32 fixed64 length-delimited&#xff08;如字符串、嵌套 message&#xff09; 嵌套结构 (nested) 多字段 repeated ✅ 封装器代码&#xff08;可直接用&#xff09; &…

喜讯 | Mediatom斩获2025第十三届TopDigital创新营销奖「年度程序化广告平台」殊荣

6月27日&#xff0c;2025第十三届TopDigital创新营销盛典在上海圆满落幕&#xff0c;TopDigital创新营销奖获奖结果也已正式揭晓。本届TopDigital创新营销奖共有694家参展企业&#xff0c;3326件案例&#xff0c;AdMergeX旗下Mediatom媒体变现SaaS及服务平台在众多作品中脱颖而…

SQL 中 EXISTS 的原理与作用详解

平常也一直在用EXISTS 来进行逻辑判断&#xff0c;但是从来没有正经理解它&#xff0c;只知道找到有就返回True&#xff0c;没有就返回False。那么今天详细的理解一下&#xff08;主要借鉴了CSDN 其他博客文章&#xff0c;以及自己做的一个小例子&#xff09; 一、EXISTS是什么…

【Docker】解决:构建(docker build)或重新运行容器时,丢失apt-get update问题

一、解决&#xff1a;构建&#xff08;docker build&#xff09;或重新运行容器时&#xff0c;丢失apt-get update问题 在 Docker 容器中&#xff0c;每次构建&#xff08;docker build&#xff09;或重新运行容器时&#xff0c;默认情况下所有更改都会丢失&#xff0c;因为容…

流程管理系统方案成本评估报告(第一稿,复盘明确数据不准确,仅供参考哦)

​​一、成本评估框架​​ 所在制造业流程数字化转型的成本需从​​一次性投入​​与​​持续运营成本​​两个维度分析,并量化​​直接收益​​与​​间接收益​​。详细评估模型初稿: ​​二、成本构成与数据支撑​​ ​​1. 一次性投入成本​​ ​​项目​​​​费用范围…

高并发分布式锁解决方案对比与选型指南

高并发分布式锁解决方案对比与选型指南 在大规模分布式系统中&#xff0c;分布式锁是确保资源互斥访问、保证数据一致性的关键组件。针对不同业务场景&#xff0c;分布式锁的实现方案多种多样&#xff0c;各有优缺点。本文将从问题背景出发&#xff0c;对Redis原生锁/RedLock、…

全面掌握Vue 3响应式:ref自动解包、reactive对象替换及响应式丢失问题

Vue 3的响应式系统是其最核心的特性之一&#xff0c;主要通过ref和reactive这两个API来实现。本文将详细介绍这两个API的使用方法、区别以及最佳实践。 1. ref()的基本使用 ref()用于创建一个响应式的数据引用。它可以包装任何类型的值&#xff0c;包括基本类型和对象类型。 …

【科普】 AI大模型应用架构图大全

AI大模型应用架构图大全 AI大模型技术全景视图&#xff1a; AI大模型通用技术架构图 AI大模型通用技术架构图 AI大模型通用技术架构图 RAG知识库业务架构图 AI农业大模型技术架构图 AI导购大模型技术架构图 AI导购大模型技术架构图 AI大模型合规风控管理架构图 AI大模型合规管…

Educational Codeforces Round 180 (Rated for Div. 2) A-D题解

A. Race 题意 在一个数轴上&#xff0c;奖品可能出现在 x x x 点或 y y y 点&#xff0c;Alice 现在在 a a a 点&#xff0c;请问Bob是否存在一个点 b b b&#xff0c;使得无论奖品出现在 x x x 点还是 y y y 点&#xff0c;Bob都能比Alice先拿到&#xff08; ∣ b −…

IPv6配置

IPv6的基本配置 构建如下图所示的实训拓扑&#xff0c;按如下要求完成实训内容&#xff1a; &#xff08;1&#xff09;启用路由器的IPv6功能&#xff1b; &#xff08;2&#xff09;配置路由器接口的IPv6地址&#xff1b; &#xff08;3&#xff09;测试两台路由器的连通性…

flutter项目环境升级二:从Flutter2.10.5升级到3.29.3

系统:windows Android Studio:Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 Flutter SDK: Flutter3.29.3 JDK: java 17 详细的AGP / Gradle / Kotlin / JDK版本兼容关系可以百度或者到官方文档查询,其他博主给的很详细。确认好想要的版本兼容 这位大哥有对照表…

【网站内容安全检测】之1:获取网站所有链接sitemap数据

不多BB&#xff0c;直接上代码&#xff1a; main.go package mainimport ("bufio""crypto/tls""fmt""io""net/http""net/url""os""strings""sync""time"_ "net/ht…

从零构建vue3项目(二)

Vue3项目增强配置&#xff1a;Axios封装、鉴权与代码扫描 1. Axios二次封装与拦截器配置 安装Axios npm install axios创建Axios实例 src/utils/request.js import axios from axios import { useUserStore } from /stores/user import router from /router// 创建axios实例…

哪家香港站群服务器比较好用?

面对鱼龙混杂的服务商市场&#xff0c;哪家的香港站群服务器真正稳定&#xff1f;毕竟搞站群最怕的就是服务器抽风&#xff0c;轻则掉排名&#xff0c;重则客户跑光光。今天咱就重点聊聊哪家香港站群服务器比较好用&#xff1f; 一般来说&#xff0c;在选择香港站群服务器提供…

Python的科学计算库NumPy(二)

5. 索引和切片 5.1 一维数组的索引和切片 import numpy as np# 一维数组索引和切片&#xff0c;跟python中的集合同样使用 bin_list[1,2,3,4,5,6] bin_arraynp.array(bin_list) print(bin_array[3]) print(bin_array[1:4]) print(bin_array[-2:-1])5.2 多维数组的索引 # 多维…

STM32和C++ 实现配置文件导入、导出功能

一.配置文件导出功能 // 导出流程 // 1. 客户端 → 设备:导出配置请求,例如:GetFlashData[d6fe30323454]:{ini} ,其中[]里面是设备序列号 // 2. 设备 → 客户端:配置文件元数据(总大小、块数量) // 3. 设备 → 客户端:发送块1(包含块序号和大小) // 4. 设备 → 客户端:…

HTTP 请求基础知识

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言HTTP 请求方法GETPOSTPUTDELETE其他方法 HTTP 请求结构常用请求头实际应用示例响应状态码 前言 HTTP (Hypertext Transfer Protocol) 是互联网上应用最广泛的协…

Django ORM 1. 创建模型(Model)

1. ORM介绍 什么是ORM&#xff1f; ORM&#xff0c;全称 Object-Relational Mapping&#xff08;对象关系映射&#xff09;&#xff0c;一种通过对象操作数据库的技术。 它的核心思想是&#xff1a;我们不直接写 SQL&#xff0c;而是用 Python 对象&#xff08;类/实例&…

【C/C++】C++ 编程规范:101条规则准则与最佳实践

C 编程规范&#xff1a;101条规则准则与最佳实践 引言 C 是一门强大而复杂的语言&#xff0c;能高效控制硬件&#xff0c;也能写出优雅抽象。然而&#xff0c;正因其复杂性&#xff0c;项目中若缺乏统一规范&#xff0c;极易陷入混乱、难维护、易出错的泥潭。 本文总结了 10…