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

这篇具有很好参考价值的文章主要介绍了计算二叉树深度算法(递归、非递归)入门详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言
二叉树在应用时,经常需要知道二叉树的深度。二叉树的深度就是二叉树的层数,即从树根算起,到最底下一层的层数是多少,即二叉树中结点的最大层次值。
本文给出了计算二叉树深度的算法,包括递归算法和非递归算法。
二、计算二叉树的基本方法
如下图所示的二叉树,其深度是4。
二叉树深度,二叉树创建及遍历,算法,数据结构,c语言
说到层数,大家自然会想到二叉树的层次遍历法。没错,其实我们只要一层一层的来遍历二叉树,当遍历到每一层的最右侧结点时,一层就遍历结束,因此可以考虑把每一层的最右侧结点作为每一层的标志,每当访问到该结类点时,二叉树的层数就可以增加1。
现在就会遇到一个问题:如何识别每一层最右侧的结点呢?
这时得回忆一下层次遍历算法,使用了队列来缓存二叉树上全部的结点,当初并没有识别每一层的最右侧结点。但是我们在层次遍历的过程中会发现,队列的队首总会走到每一层最右侧的结点位置,因此可以考虑通过判断队首的位置来识别最右侧结点,进而就可以得到层数。而且大家还会发现一个结论,那就是每一层最右侧的结点的左或者右子树也可能是下一层的最右侧结点(层尾结点)。当发现了这个结论,那么计算二叉树的深度就变得轻而易举了。
下面以上图为例演示一下按照层次遍历时,来识别二叉树深度的过程。
Step 1:树根a进队列,队列状态如下图所示:
二叉树深度,二叉树创建及遍历,算法,数据结构,c语言Step 2:队首出队列,队列状态如下图所示:
二叉树深度,二叉树创建及遍历,算法,数据结构,c语言
此时队首和队尾指向了同一个位置,也就是第一层遍历结束了,之后访问出队列的元素,并判断其左右子树是否为空,不空则继续入队列,所以就得到如下图所示的队列:
Step 3:结点a的左、右结点入队列
二叉树深度,二叉树创建及遍历,算法,数据结构,c语言
此时,其实我们又发现了:rear指向了队尾的前一个位置,就是一层结束的位置,如果在此处设个标志,是否可行?我们接着往下看。
Step 4:队首继续出队列、访问,访问之后,其左右子树非空的话,则继续入队列。
二叉树深度,二叉树创建及遍历,算法,数据结构,c语言当连续两次队首出队列之后,队列状态如上图所示,这是就会发现front的位置和新增加的标志位置相同了,这是其实又是一层的结束位置。
到这里,是不是就可以发现,引入这个标志的用处了?
因为当前层最后一个结点,它的左子树或者右子树也基本上就是下一层的最后一个结点,当然了如果当前层的最右侧结点的左右子树同时为空,则也可能是再左侧一些的结点是下一层的队尾(如图中所示的结点g就不是上一层尾结点的子树)。因此,我们在设定了当前层最右侧标志之后,则该最右侧结点的左或右子树入队列后的队尾,是不是就可能是新的标志位了?对头,就是这样的。
所以当某个结点的左右子树入队列的时候,队尾就可能是一层的结束位置。这也就是为什么在算法中是执行了某个结点的左右子树都入队列之后才判断是否是一层的结束了。(说的好像有点啰嗦了,原谅我)
进而只需要判断队首front的值和新增加的标志(不妨记为levelLoc)的值是否相同即可,相同则表示一层结束,总层数就可以加1了,同时把levelLoc的值更新为队列当前的队尾这是因为此时队尾可能就是上一层队尾的子树。
后面的步骤就不用再赘述了,直接上代码。
三、计算二叉树深度的源代码:
1、结点结构

typedef struct node
{
	char data;
	struct node *Lchild;
	struct node *Rchild;
}BiTree;

2、递归算法

int BiTreeDepth( BiTree *T )
{
	int dep1 = 0, dep2 = 0;
	if ( T == NULL )
		return 0;
	else
	{     
		dep1 = BiTreeDepth( T->Lchild );
		dep2 = BiTreeDepth( T->Rchild ); 
		if ( dep1 > dep2 )  
			return dep1 + 1;
		else         
			return dep2 + 1;
	}
} 

3、非递归算法文章来源地址https://www.toymoban.com/news/detail-795792.html

int Search_Depth( BiTree *T)
{
	BiTree  *Queue[MAX_NODE]
    BiTree  *p = T;
	int  front=0 , rear=0, depth=0, levelLoc;
	// level总是指向访问层的最后一个结点在队列的位置
	if( T != NULL )
        Queue[++rear] = p;    //根结点入队
    levelLoc = rear;               //根是第1层的最后一个节点
    while ( front < rear )
	{
		p = Queue[ ++front ]; 
		if ( p->Lchild != NULL )   Queue[ ++rear ] = p->Lchild; //左结点入队
		if ( p->Rchild != NULL )   Queue[ ++rear ] = p->Rchild; //右结点入队
		if ( front == levelLoc ) //访问到当前层的最后一个结点 
		{
			depth++;  
			levelLoc = rear; 
		}
	}
	return depth;
}
  1. 配合使用创建二叉树的算法(参见二叉树专栏里的算法https://mp.csdn.net/mp_blog/manage/column/columnManage/11925622)就可以完整的运行了,此处不再赘述。

到了这里,关于计算二叉树深度算法(递归、非递归)入门详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法----详解二叉树的遍历(迭代、递归)

    ❤️ 作者简介 :大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生,蓝桥杯国赛二等奖获得者 🐟 个人主页 :https://blog.csdn.net/qq_52007481 ⭐ 个人社区 :【小鱼干爱编程】 🔥 算法专栏 :算法竞赛进阶指南 💯 刷题网站 :虽然市面上有很多的刷题网站,但是里面

    2024年01月24日
    浏览(41)
  • 二叉树入门算法题详解

    首先知道二叉树是什么: 代码随想录 (programmercarl.com) 了解后知道其实二叉树就是特殊的链表,只是每个根节点节点都与两个子节点相连而其实图也是特殊的链表,是很多节点互相连接;这样说只是便于理解和定义,严格来说他们都是不同的数据结构了,在使用中还是要牢记

    2024年02月22日
    浏览(28)
  • 二叉树的最大深度和最小深度(两种方法:递归+迭代)

    二叉树的最大深度:   二叉树的最小深度: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。  输入:root = [3,9,20,null,null,15,7] 输出:2  

    2024年02月15日
    浏览(27)
  • 二叉树遍历非递归算法

    •三种遍历 ​ • 先序遍历: 根节点–左子树–右子树 ​ • 中序遍历: 左子树–根节点–右子树 ​ • 后序遍历: 左子树–右子树–根节点 •两类算法 ​ • 递归算法(具体看我上一篇文章) ​ ♥直观,易读 ​ ♥效率低下 ​ • 非递归算法 ​ ♥ 如果一个算法可以使用递归

    2024年02月04日
    浏览(33)
  • Java 数据结构篇-二叉树的深度优先遍历(实现:递归方式、非递归方式)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍    文章目录         1.0 二叉树的说明         1.1 二叉树的实现         2.0 二叉树的优先遍历说明         3.0 用递归方式实现二叉树遍历         3.1 用递归方式实现遍历 - 前序遍历         3.2 用递归

    2024年02月05日
    浏览(40)
  • 二叉树的非递归遍历算法

    二叉树的遍历是指访问二叉树的每个结点,且每个结点仅被访问一次。二叉树的遍历可按二叉树的构成以及访问结点的顺序分为4种方式:先序遍历、中序遍历、后序遍历和层次遍历。请至少给出其中一种遍历方式的非递归算法的思路和代码,并举例演示算法的执行过程。 算

    2023年04月24日
    浏览(32)
  • 【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

      二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是 空集 ,被称为 空二叉树 ,要么由一个根结点和两棵不相交的子树组成,分别称为 左子树 和 右子树 。每个结点最多有两个子结点,分别称为左子结点和右子结点。 引理5.1:二叉树中层数

    2024年02月01日
    浏览(30)
  • 二叉树的遍历的递归与非递归算法

    按照一定规律对二叉树的 每个结点进行访问且 仅访问一次 ; 这里的访问:可以是计算二叉树中的结点数据,打印该结点的信息,也可以是对结点进行的任何其它操作! 为什么需要遍历二叉树? 从过遍历可以得到访问结点的顺序序列,遍历操作就是将二叉树的结点按一定的

    2024年04月15日
    浏览(27)
  • 二叉树遍历的非递归算法

    非递归的算法主要采用的是循环出栈入栈来实现对二叉树的遍历,下面是过程分析 以下列二叉树为例:(图片来自懒猫老师《数据结构》课程相关内容) 1.前序遍历 前序遍历的顺序为:根结点-左子树-右子树 基本过程: (1) 访问根结点 ,将根结点入栈 (2)循环逐个访问

    2024年02月02日
    浏览(31)
  • 【算法第十一天7.25】二叉树前、中、后递归、非递归遍历

    树的结构 ================================================ 链接 :力扣94-二叉树中序遍历 递归 思路 1、 确定返回值和方法参数 :需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值 2、 确定终止条件 :当前节点为空时,

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包