二叉树4:二叉树求树高度(超级详细)
一、思路
什么是树高?
树的高度(或深度)就是树中结点的最大层数。
在这里使用后序遍历的递归算法。
对每一个结点都进行如下操作:
- 后序遍历其左子树求树高
- 后序遍历其右子树求树高
- 对这个结点进行下面操作:
- 比较其左右子树的高度大小
- 若左>右,则选择左的高度;反之,选择右的高度
- 将上一步选出的
高度+1
,并作为返回值返回
递归算法比较抽象,这里举个例子
比如上面这个图,按照后序遍历的序列,第1个遍历到的会是①这个结点。
然后,对①进行上面的处理。
- ①左子树高度为0,右子树高度为0
- 比较左右子树大小,若左大于右,则选择左。此时,左不大于右,那么选右:0
- 对0+1,然后将1返回给上一层。即就是,作为结点④其左子树的高度返回上去。
第2个遍历到的是②这个结点:
同样的道理,可以得到②结点会返回给上一层1。
第3个遍历的是④结点:
遍历到④的时候,其左右子树的高度已经由前两步骤得出来了,都是1。
接着,对4进行同样的操作,比较其左右子树的高度。
若左子树高于右子树,就选择左子树的高度,否则选择右子树。
这里左右都是1。那么选右子树的1。
接着,1+1=2。
这个结果就是遍历根节点⑤的左子树所得到的结果。
然后用同样的方式遍历右子树,最后回到根节点。
对根节点的处理方式也相同:
比较左右树的高度,选高的,然后+1返回最终的结果就是树高。
二、代码实现
这个是代码实现,如果看不明白的,上去看看对每个结点处理的方式,和上面举的例子
typedef struct TreeNode{int data;//数据域TreeNode *RChild;//右孩子指针TreeNode *LChild;//左孩子指针
}TreeNode, *BiTree;int getdepth(TreeNode* node) {//1.确定递归函数的返回值和参数:参数-传入根节点 返回值-int//2.终止条件:如果为空节点,返回0,表示高度为0if (node == NULL) return 0;//3.确定单层递归的逻辑int leftdepth = getdepth(node->LChild);//递归求左子树高度int rightdepth = getdepth(node->RChild);//递归求右子树高度//int depth = 1 + max(leftdepth, rightdepth);//树的高度是根到叶子最长路径上的结点的数量int depth = 1 + (leftdepth > rightdepth?leftdepth:rightdepth);//这样写和上一行一样//所以,每次要找最高的那个子树,所以要使用max函数//调用两个递归函数直接可以算出来两个子树的高度,取最高的子树就作为子树高度,再加上根节点高度就行return depth;//在这个题目中,我们认为的高度是从根节点到叶子节点最长路径上结点的数量//所以,如果这个二叉树只有一个节点,那么这个树的高度就是1
}
二叉树4:二叉树求树高度(超级详细)相关推荐
- 二叉树--求树的高度
实现思想: 1.求树高时我们可以利用递归思想来求.而递归主要的思想就是要将大问题化为小问题. 2.我们求树高时,可以分别求左右子树的高度然后比较左右子树的高度,返回较大的值. 代码实现: int ma ...
- c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用
用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...
- Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)
在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码 PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型 一.接口及链结点定义 package ...
- 超级详细树讲解三 —— B树、B+树图解+代码
首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...
- 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)
文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...
- 以孩子兄弟链表为存储结构,请设计递归算法求树的高度
题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度 分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者. 代码如下: typedef struct ...
- 算法基础11 —— 树入门(二叉树的遍历以及构造 + 普通树转换成二叉树 + 例题 + 二叉树的一些操作)
字符二叉树的遍历 对于以上二叉树 先序遍历为(根左右) : ABCDEFG 中序遍历为(左根右) : CBEDAFG 后序遍历为(左右根) : CEDBGFA 层序遍历:(从左往右.从上往下) ABF ...
- 二叉树Ⅰ · 树型结构 · 二叉树 · 满二叉树 · 完全二叉树 · 二叉树的性质 · 二叉树的存储
目录 一.树型结构(了解) 1.1 引入和特点 1.2 概念(重要) 1.3 树的表示形式(了解) 二.二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 满二叉树 完全 ...
- 树与二叉树(二叉树前传、数据结构初阶、C语言)
文章目录 前言 一.树的概念及结构 (一).树的概念 (二).树的相关概念 (三).树的表示 二.二叉树的概念及结构 (一).二叉树的概念 (二).满二叉树和完全二叉树 (三).二叉树的性质 (四). ...
最新文章
- python不断刷新网页_python多线程不断刷新网页的代码
- 改变自己从学习linux开始
- Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
- 转 AIX7.2+11.2.0.4RAC实施
- python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...
- [笔记]远程终端API,Terminal Services Administration
- 【ElasticSearch】Es 源码之 IngestService 源码解读
- java web前端邮件,javaweb之javamail
- mooc c语言第三周作业,2017moocC语言第七周答案
- Know more about _in_memory_undo
- 梁刚:基于云原生技术建设“武汉健康云”云平台架构
- CR渲染器全景图如何渲染颜色通道_CR渲染如何设置渲染AO图和材质通道?
- 深圳监控安装上门服务简介
- 合肥辰工科技有限公司简介及公司产品介绍
- java中form用法_SpringMVC表单标签使用详解
- 求点赞、被点赞,社交网络用户对点赞又爱又恨
- 如何将EndNote中的参考文献插入到word中
- 【2022-08-27】美团秋招笔试前四道编程题
- 【AlarmManager】待机唤醒功能
- 开发团队PMO如何构建管理更有效?
热门文章
- 分位数和分位线(Quantiles and Percentiles)
- 符合自己业务场景的自定义表单自定义报表及自定义图表
- 思维导图制作软件|mindmanager 2012 10.1汉化版 下载地址
- 803计算机网络考研题型,2016年重庆邮电大学803计算机网络考试大纲
- python通讯录编程_python实现简单通讯录
- 树莓派教程二-网络配置
- css 实现image宽度百分百,高度跟宽度一样大小
- 索尼黑卡相机Sony Rx100-M3与手机互联APP相关问题
- “北斗一号”卫星导航系统与GPS系统比较
- linux 更新 图标缓存,Windows图标显示错误解决方法(清理图标缓存BAT脚本)