一、思路

什么是树高?
树的高度(或深度)就是树中结点的最大层数。

在这里使用后序遍历的递归算法。

对每一个结点都进行如下操作:

  • 后序遍历其左子树求树高
  • 后序遍历其右子树求树高
  • 对这个结点进行下面操作:
    • 比较其左右子树的高度大小
    • 若左>右,则选择左的高度;反之,选择右的高度
    • 将上一步选出的高度+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. 二叉树--求树的高度

    实现思想: 1.求树高时我们可以利用递归思想来求.而递归主要的思想就是要将大问题化为小问题. 2.我们求树高时,可以分别求左右子树的高度然后比较左右子树的高度,返回较大的值. 代码实现: int ma ...

  2. c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用

    用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...

  3. Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)

    在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码 PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型 一.接口及链结点定义 package ...

  4. 超级详细树讲解三 —— B树、B+树图解+代码

    首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...

  5. 【数据结构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 ...

  6. 以孩子兄弟链表为存储结构,请设计递归算法求树的高度

    题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度 分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者. 代码如下: typedef struct ...

  7. 算法基础11 —— 树入门(二叉树的遍历以及构造 + 普通树转换成二叉树 + 例题 + 二叉树的一些操作)

    字符二叉树的遍历 对于以上二叉树 先序遍历为(根左右) : ABCDEFG 中序遍历为(左根右) : CBEDAFG 后序遍历为(左右根) : CEDBGFA 层序遍历:(从左往右.从上往下) ABF ...

  8. 二叉树Ⅰ · 树型结构 · 二叉树 · 满二叉树 · 完全二叉树 · 二叉树的性质 · 二叉树的存储

    目录 一.树型结构(了解) 1.1 引入和特点 1.2 概念(重要) 1.3 树的表示形式(了解) 二.二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 满二叉树 完全 ...

  9. 树与二叉树(二叉树前传、数据结构初阶、C语言)

    文章目录 前言 一.树的概念及结构 (一).树的概念 (二).树的相关概念 (三).树的表示 二.二叉树的概念及结构 (一).二叉树的概念 (二).满二叉树和完全二叉树 (三).二叉树的性质 (四). ...

最新文章

  1. python不断刷新网页_python多线程不断刷新网页的代码
  2. 改变自己从学习linux开始
  3. Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
  4. 转 AIX7.2+11.2.0.4RAC实施
  5. python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...
  6. [笔记]远程终端API,Terminal Services Administration
  7. 【ElasticSearch】Es 源码之 IngestService 源码解读
  8. java web前端邮件,javaweb之javamail
  9. mooc c语言第三周作业,2017moocC语言第七周答案
  10. Know more about _in_memory_undo
  11. 梁刚:基于云原生技术建设“武汉健康云”云平台架构
  12. CR渲染器全景图如何渲染颜色通道_CR渲染如何设置渲染AO图和材质通道?
  13. 深圳监控安装上门服务简介
  14. 合肥辰工科技有限公司简介及公司产品介绍
  15. java中form用法_SpringMVC表单标签使用详解
  16. 求点赞、被点赞,社交网络用户对点赞又爱又恨
  17. 如何将EndNote中的参考文献插入到word中
  18. 【2022-08-27】美团秋招笔试前四道编程题
  19. 【AlarmManager】待机唤醒功能
  20. 开发团队PMO如何构建管理更有效?

热门文章

  1. 分位数和分位线(Quantiles and Percentiles)
  2. 符合自己业务场景的自定义表单自定义报表及自定义图表
  3. 思维导图制作软件|mindmanager 2012 10.1汉化版 下载地址
  4. 803计算机网络考研题型,2016年重庆邮电大学803计算机网络考试大纲
  5. python通讯录编程_python实现简单通讯录
  6. 树莓派教程二-网络配置
  7. css 实现image宽度百分百,高度跟宽度一样大小
  8. 索尼黑卡相机Sony Rx100-M3与手机互联APP相关问题
  9. “北斗一号”卫星导航系统与GPS系统比较
  10. linux 更新 图标缓存,Windows图标显示错误解决方法(清理图标缓存BAT脚本)