二叉树求解大小操作详解

目录

一、求所有结点个数

1.1 递归思路

1.2 递归分支图

1.3 递归栈帧图

1.4 C语言实现

二、求叶子结点个数

2.1 递归思路

2.2 递归分支图

2.3 递归栈帧图

2.4 C语言实现

三、求第K层的结点个数

3.1 递归思路

3.2 递归分支图

3.3 递归栈帧图

3.4 C语言实现

四、求二叉树高度

4.1 递归思路

4.2 递归分支图

4.3 递归栈帧图

4.4 注意事项

4.5 C语言实现


一、求所有结点个数

1.1 递归思路

考虑特殊情况:

  1. 如果是空节点,返回0

考虑一般情况:

  1. 总结点的数目就是左右子树所含结点的和加上自身结点

  2. 每个节点都可被看作根节点,去重复递归左右子树

1.2 递归分支图

1.3 递归栈帧图

1.4 C语言实现

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

二、求叶子结点个数

2.1 递归思路

考虑特殊情况:

  1. 如果是空节点,则返回0
  2. 如果是叶子结点,则返回1

考虑一般情况:

  1. 总结点的数目就是左右子树所含结点的和

  2. 每个节点都可被看作根节点,去重复递归左右子树

2.2 递归分支图

2.3 递归栈帧图

 

2.4 C语言实现

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

三、求第K层的结点个数

3.1 递归思路

考虑特殊情况:

  1. 如果结点为空,返回0
  2. 如果层数为1,返回1

考虑一般情况:

每个节点都可被看作根节点,去重复递归左右子树。那么此时层数要减去1

3.2 递归分支图

3.3 递归栈帧图

3.4 C语言实现

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

四、求二叉树高度

4.1 递归思路

考虑特殊情况:

  1. 如果结点为空,返回0

考虑一般情况:

  1. 高度就等于子树的高度加上自身的高度
  2. 返回的是左右子树中更大的值

4.2 递归分支图

4.3 递归栈帧图

4.4 注意事项

由递归的知识可知,函数每次调用都会建立栈帧,各个栈帧间互不影响,所以需要把每次得到的值存起来,不然每次调用都会去再次递归寻找。大大浪费时间,降低程序执行的效率。

4.5 C语言实现

int TreeHeight(BTNode* root)
{if (root == NULL){return 0;}int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);return leftHeight > rightHeight ?leftHeight + 1 : rightHeight + 1;
}

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

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

相关文章

【python】使用函数名而不加括号是什么情况?

使用函数名而不加括号通常是为了表示对函数本身的引用,而不是调用函数。这种用法通常出现在下面这几种情况: 作为回调函数传递:将函数名作为参数传递给其他函数,以便在需要时调用该函数。例如,在事件处理程序或高阶函数…

冯喜运:5.24现货黄金趋势解读,黄金原油行情分析及操作建议

【黄金消息面分析】:美国劳工部公布的最新数据显示,截至5月18日的一周内,首次申请失业救济人数下降至21.5万人,创下自去年9月以来的最大降幅。数据公布后,现货黄金短线下挫6美元,报2362.71美元/盎司。这表明…

2024受欢迎的便签app是哪个

在繁忙的工作和生活中,便签app成为了我们不可或缺的小助手。2024年,随着人们对高效工作和生活品质的追求,选择一款功能强大且用户友好的便签app显得尤为重要。在众多选择中,敬业签以其出色的记录与提醒功能,脱颖而出&a…

前端发版如何告知用户

在具体项目场景中,前端发版后,用户不手动刷新,则感知不到更新;经常会出现:前端更新了某个功能,导致旧功能使用出现问题,而被用户提单; 关于这个问题有多种解决方式: We…

Python知识详解【1】~{正则表达式}

正则表达式是一种用于匹配字符串模式的文本工具,它由一系列普通字符和特殊字符组成,可以非常灵活地描述和处理字符串。以下是正则表达式的一些基本组成部分及其功能: 普通字符:大多数字母和数字在正则表达式中表示它们自己。例如…

指针,指针变量,引用,取地址符,malloce()函数使用,C中“—>” 和“ . ” 作用与区别

目录 一:指针,指针变量,引用,取地址符: 前提 : 1.“ * ” 的两种用途 2." & “的两种用途 2.1:引用 2.2:取地址 补充: 二 : malloc(),动态申请地址空间 1.原型定义…

Dubbo生态之初识dubbo协议

1.RPC框架 在java的发展中,随着业务的越来越庞大,单体架构的工作繁琐且耦合度高,因此单体架构过渡到了分布式架构,而分布式架构就必然涉及到各个服务之间的远程通信(RPC框架),RPC框架如图所示: 工作流程: a.客户端调…

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割HOME当前用户主目录:/rootSH…

有道:一季度业绩超市场预期,生成式AI商业化落地进程加快

5月23日,教育科技公司网易有道(NYSE:DAO)公布了2024年第一季度未经审计的财务报告。报告期内,受益于“AI”加“教育”双轮驱动,业绩表现超市场预期,业务健康度大幅改善。 财报显示,…

5.23小结

1.java项目创新 目前想添加一个自动回复的功能和设置验证方式有(允许任何人添加,禁止添加,设置回答问题添加,普通验证添加) 目前只完成画好前端界面,前端发送请求,还有表的修改 因为涉及表字…

leetcode 210.课程表II

思路:拓补排序 其实就是对于第一个题的问题变了一个问法,上一个题本质上是求有没有环,这道题本质上就是让你求出来符合没有环的路径输出而已,本质上没有什么区别。 不同就在于这里需要你额外开一个数组用来存储你遍历这个有向图…

大语言模型量化方法对比:GPTQ、GGUF、AWQ 包括显存和速度

GPTQ: Post-Training Quantization for GPT Models GPTQ是一种4位量化的训练后量化(PTQ)方法,主要关注GPU推理和性能。 该方法背后的思想是,尝试通过最小化该权重的均方误差将所有权重压缩到4位。在推理过程中,它将动态地将其权重去量化为f…

nn.Linear

文章目录 一、nn.Linear 一、nn.Linear nn.Linear 是 PyTorch 中的一个类,用于定义线性变换(全连接层)。它是神经网络中常用的一种层类型,作为输入张量与权重矩阵之间的线性变换。 nn.Linear(in_features, out_features, biasTru…

决策树最优属性选择

本文以西瓜数据集为例演示决策树使用信息增益选择最优划分属性的过程 西瓜数据集下载:传送门 首先计算根节点的信息熵: 数据集分为好瓜、坏瓜,所以|y|2根结点包含17个训练样例,其中好瓜共计8个样例,所占比例为8/17坏…

2024-5-4-从0到1手写配置中心Config之基于h2的config-server

添加依赖 新建的web工程中添加h2的依赖 添加h2的配置 设置数据源和密码设置初始化sql语句打开h2的控制台 初始化语句创建一个config表,保存服务配置信息。 完成CRUD接口 controller类 mapper接口 测试 在web控制台可以看到sql已经初始化完成,crud接口…

前端基础入门三大核心之HTML篇:深入解析PNG8、PNG16、PNG24与PNG32的差异及网页应用指南

前端基础入门三大核心之HTML篇:深入解析PNG8、PNG16、PNG24与PNG32的差异及网页应用指南 基础概念与作用说明PNG8PNG16PNG24PNG32 代码示例与使用场景PNG8示例PNG24示例PNG32示例 性能优化与最佳实践防范漏洞提示结语与讨论 在网页设计与前端开发中,选择…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域,PLC工程师扮演着至关重要的角色,他们负责构建、维护自动化系统,推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段,每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

Kotlin协程在android中的使用总结

认识协程 引用官方的一段话 协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度…

JDK、JRE、编译指令和垃圾回收机制详解

JDK 全称 Java SE Development Kit (Java 开发工具包) JVM虚拟机:Java运行的地方 核心类库:Java提前编好的东西 开发工具: javac,java,jdb,jhat javac:Java编译器,用于将Java源代码编译成Java字节码文件(.class)。 java: java…

[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、详细步骤 1.光学指纹模块 2.配置STM32CUBEMX 3.程序设计 3.1 输出重定向 3.2 导入AS608库 3.3 更改端口宏定义 3.4 添加中断处理部分 3.5 初始化AS608 3.6 函数总览 3.7 录入指纹 3.8 验证指纹 3.9 删除指纹 3.10 清空指纹库 三、总结及资源 一、前言 …