求二叉树深度的算法

  • 求二叉树深度
    • 方法一:深度优先的遍历方式
    • 方法二:广度优先的遍历方式
  • 总结

求二叉树深度

注:本文中二叉树通过二叉链表构建。
节点类型定义如下:

struct node{char data;node *lchild;node *rchild;
};

方法一:深度优先的遍历方式

思路一(自上向下):每下一层,就和当前暂存的最大的深度作比较并取最大值

对二叉树做遍历操作,最简单可以用递归的方式实现。
这就需要我们对递归进行下一层的时候,需要记录下一层的深度等于当前深度+1。

通过递归实现后的代码如下:

int maxDeep = 0; //暂存的最大深度
void MaxDeep(node* root, int nowDeep){if (root == NULL){//递归结束条件,说明这一层已经不是二叉树的节点,也就不需要使nowDeep和maxDeep进行比较return;}maxDeep = max(maxDeep, nowDeep);//取较大值MaxDeep(root->lchild, nowDeep+1);//递归处理左子树MaxDeep(root->rchild, nowDeep+1);//递归处理右子树
}

需要注意的是,调用时,根节点的深度为一,即nowDeep传1。

思路二(自下向上):当前树的最大深度等于其子树的最大深度+1
在第一种思路中,我们需要借助一个额外的变量maxDeep去记录当前处理过的最大深度,这是一个外部变量,当然可以放到形参里面,但是一个对递归没有什么作用的数作为一个形参出现就会显得有些奇怪,用起来也不方便。

为了方便使用,我们可以换一种思路:
既然自上向下的路走不通,可以反过来走。

对于一棵二叉树,可以根据有无父节点分为“根节点”和“非根节点”,对于每个“非根节点”又可以作为一棵新的树的根节点。那么这种思路反过来,就有了:
当前树的最大深度等于其子树的最大深度+1。这里的“1”是根节点自己还有一层深度需要加上。

以这种思路实现的代码:

int maxDeep(node* root){if(root == NULL){//递归到叶子节点的“子树”,不存在,其深度为0,递归结束。return 0;}return max(maxDeep(root->lchild),maxDeep(root->rchild))+1;//如果有子树,其深度为左右子树的最大值+1。
}

这个代码还可以简写成:

int maxDeep(node* root){return root == NULL ? 0 : max(maxDeep(root->lchild),maxDeep(root->rchild))+1;
}

方法二:广度优先的遍历方式

深度优先的方式是一路走到黑,记录路径长度。
那么广度优先的方式就是真真正正的计算层次来得到二叉树的深度了。

这里用到了二叉树的层次遍历的思路
实现代码:

struct que{//只是封装了队列节点类型,并没有自己封装队列,可以使用STL的queue进行操作node* root;int index;
}; int maxDeep(node* root){que q[505];for (int i = 0;i < 505; i++){//初始化q[i].root = NULL;q[i].index = 0;}//层次遍历int head = 0;int tail = 1;q[tail].root = root;//根节点入队q[tail].index = 1;while (head != tail){head++;//当然也可以写成环形队列的方式if (q[head].root->lchild != NULL){//其左子树不为空tail++;q[tail].root = q[head].root->lchild;//左子树入队q[tail].index = q[head].index+1;//记录其左子树的根节点所在层数为该节点层数+1}if (q[head].root->rchild != NULL){//其右子树不为空tail++;q[tail].root = q[head].root->rchild;//右子树入队q[tail].index = q[head].index+1;//记录其右子树的根节点所在层数为该节点层数+1}}return q[tail].index;//做到最后就是最深的一层,即为二叉树的深度
}

总结

  • 两种方法各有优劣,深度优先的方法使用了递归的方式进行实现,对时间和空间的消耗都是较大的,但编码复杂度极低;广度优先的方法则相反,对时间空间的消耗较小,但编码复杂度较高。
  • 深度优先的方式可以不适用递归的方式进行,需要手动用栈进行模拟递归,对系统时间和空间的消耗有所改善,但编码复杂度将会提高,需要自行进行取舍。
  • 在广度优先的方式实现时没有对队列进行封装,同时可以使用C++ STL的queue进行实现。

求二叉树深度算法(深度优先、广度优先)相关推荐

  1. 【数据结构】求二叉树深度的算法

    要求二叉树的深度,方法是先求出左子树的深度,再求出右子树的深度,二叉树的深度就是左子树的深度和右子树的深度中的最大值加1. 自然而然想到用后根遍历的思想实现 主要步骤如下: 若二叉树为空,则返回0值, ...

  2. 计算二叉树深度算法(递归、非递归)入门详解

    一.引言 二叉树在应用时,经常需要知道二叉树的深度.二叉树的深度就是二叉树的层数,即从树根算起,到最底下一层的层数是多少,即二叉树中结点的最大层次值. 本文给出了计算二叉树深度的算法,包括递归算法和非 ...

  3. C++求二叉树深度的两种方法

    今天在leetcode中碰到了求二叉树的深度问题,于是总结一下这两种方法 方法一是用递归的方法,方法二是借助队列和层序遍历的思想 #include<iostream> #include&l ...

  4. 求二叉树深度以及寻找二叉树中某一节点值

    求二叉树的深度依然用的是二叉树递归的特性.二叉树的深度就是你根节点的这一层加上他左孩子或者右孩子中深度大的哪一个,同样这也能被划分为子问题. size_t BTreeDepth(BTNode* roo ...

  5. 判断完全二叉树及求二叉树深度完整代码

    完全二叉树定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二 ...

  6. python求二叉树深度(递归)

    def tree_deep(root):if not root:return 0 #说明上一个节点是叶子节点,开始逐步返回left, right = 0, 0if root.left:left = t ...

  7. 【笔记】顺序存储结构求二叉树深度

    代码: #include<vector> using namespace std; vector<int> e[100005]; int dep[100005], f[1000 ...

  8. 算法 深度优先,广度优先

    转载于:https://www.cnblogs.com/angdh/p/10802024.html

  9. 基于visual Studio2013解决面试题之0601二叉树深度

     题目 解决代码及点评 /*求二叉树深度 */#include <iostream> #include <stack> using namespace std;templ ...

最新文章

  1. windowsXP用户被禁用导致不能网站登录
  2. Base64编码的字符串与图片的互转
  3. php函数表达式,php正则表达式常用函数介绍
  4. JsonMappingException: (was java.lang.NullPointerException)
  5. html判断安装没安装qq,QQ6.1体验版怎么用?腾讯QQ6.1体验版本安装步骤(无须申请体验账号)...
  6. 检测文章相似度的方法?文章原创度检测工具免费
  7. 如何用Python下载百度指数的数据
  8. mysql id 主键 外键_mysql主键 外键
  9. echarts 时间轴处理_图样图森破-pyecharts之时间轴
  10. 一名合格的Java后端工程师或架构师必须要掌握 Spring Framework、Spring Boot、Spring Cloud
  11. 2021年数学建模国赛B题优秀论文(Word)(04烯焼制备分析与试验设计)
  12. 详解联通无线上网资费:
  13. 数据在链路层传播相关时间计算
  14. 学习编程太枯燥?12款助你学编程的免费游戏送上!
  15. linux系统与window区别,Linux和windows操作系统有哪些区别
  16. 【NFS共享存储服务】
  17. 彻底搭建云笔记(附插件)
  18. 04.ARM-mini2440-内存管理单元(MMU)
  19. IC功能芯片的封装和包装经验
  20. 华为od一面 / 二面复盘(可内推)

热门文章

  1. coderwhy--前端知识整合包--htmlcss08
  2. 计算机毕业设计Java博物馆交流平台(源码+系统+mysql数据库+lw文档)
  3. 怎么应用计算机中搜索程序,搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织...
  4. wifi常用的调制技术
  5. 不想当厨师的裁缝不是好司机
  6. mybatis-generator自动生成dao、mapping、bean配置详解(转)
  7. 数字信号的2DPSK调制与解调
  8. 轻松清理电脑中几十G大文件的操作方法
  9. 已从印象笔记转到语雀
  10. 【Dragon of Loowater】【UVA - 11292】(思维)