【数据结构】二叉树中的递归问题(超详细画图~)

这篇具有很好参考价值的文章主要介绍了【数据结构】二叉树中的递归问题(超详细画图~)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】二叉树中的递归问题(超详细画图~),数据结构,数据结构,开发语言,c语言


和光同尘_我的个人主页
不管风吹浪打,胜似闲庭信步。 --毛泽东

🕯️前言

我本来还说上节难来着,没想到这节更难🥲
不过我既然会了保证xdm也能看懂👍

1. 前置说明

首先回顾下二叉树的概念

二叉树是由:空树 或者非空树(根节点,根节点的左子树、根节点的右子树)组成的

【数据结构】二叉树中的递归问题(超详细画图~),数据结构,数据结构,开发语言,c语言
从概念中可以看出,二叉树定义是递归式的,后面的思路都是基于此概念实现的

2. 二叉树的遍历

2.1. 前序、中序和后序遍历

二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

  1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
  • 前序遍历示意(打印访问结果):
void PrevOrder(BinaryTreeNode* root) 
{
	if (root == NULL) {
		printf("NULL ");
		
		return;
	}

	printf("%d ", root->val);
	PrevOrder(root->left);
	PrevOrder(root->right);
}
  • 逻辑示意

【数据结构】二叉树中的递归问题(超详细画图~),数据结构,数据结构,开发语言,c语言

中序后序画不动了…太麻烦了🥲

  • 前序、中序、后序的差别就是访问一棵树的顺序,在上图中访问根为1的树时,根据前序根、左、右的顺序,我们先访问了根节点1,而后访问1的左子树,即根为2的节点,而后又先访问了根节点2,完成堆根节点2、左右子树的访问后、才能回退到对节点1右子树的访问……
    而如果是中序的话,访问根为1的树时,会直接从根节点1的左子树开始,即根为2的数,完成对2的左右子树、根的访问,才会访问根节点1…

  • 明白了这些我们才能理解后面递归问题的思路

3. 二叉树的简单递归问题

3.1. 求二叉树节点个数

对于这个整体问题,我们可以将其分化成每个树之间联系的小问题
对于每棵树来说,树的节点总和等于根节点+左右子树节点数量的和,即左右子树节点数+1
因此可以得到下面这段代码:

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
  • 递归问题的代码通常比较短,我们可以通过画图理解其逻辑
  • 以这样的二叉树为例

【数据结构】二叉树中的递归问题(超详细画图~),数据结构,数据结构,开发语言,c语言
【数据结构】二叉树中的递归问题(超详细画图~),数据结构,数据结构,开发语言,c语言

3.2. 求叶子节点个数

这道题与上面的思路类似,同样时树的叶子结点数量等于左右子树叶子节点的数量之和,只需要多加一个判断是否为叶子节点即可。

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) + 1;
}

3.3. 求第K层节点个数(根节点为第1层)

这个比起前两道又加了一丢丢难度,不过我们还是一样的思路:

  • 当前树的第K层即为左子树的第k-1层右子树的k-1层
int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);

	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

3.4. 单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
力扣—单值二叉树

  • 这道题又有了一丢丢的变化,我们先按之前的思路,每个节点都相同,即每个树的根都等于左右子树的根,函数要求返回bool值,也就是 根=左子树的根 && 根=右子树的根 为真可是这样的话每个树会有:两个子树,只有左、右子树,没有子树;相等,不相等一共8种情况,这也太复杂了😵‍💫
  • 但是我们又会发现,叶子结点对应的树必返回真,那么我们只需要判断为假,即不相等的情况,就可以判断整体的真假,又因为我们不确定是否有左右子树,因此分情况讨论:
    左子树存在,根不等于左子树的根,返回假;
    右子树存在,根不等于右子树的根,返回假;

我们就得到了这段代码:

bool isUnivalTree(struct TreeNode* root) {

	//叶子结点对应的树返回真
	if (root == NULL)
		return true;

	//左子树存在,根不等于左子树的根,返回假;
	if (root->left != NULL && root->val != root->left->val)
		return false;

	//右子树存在,根不等于右子树的根,返回假;
	if (root->right != NULL && root->val != root->right->val)
		return false;
		
	return isUnivalTree(root->left) && isUnivalTree(root->right);
}

🗝️总结

  • 通过对二叉树遍历以及递归问题的学习,还是发现了一点规律的,在此类递归问题中,我们主要通过分析每个树之间的关系,设想可能出现的结果,在合理的把子树链接起来,基本就能解决问题😎
本节完~~,如果你在实现过程中遇到任何问题,欢迎在评论区指出或者私信我!💕

新人博主创作不易,如果有收获可否👍点赞✍评论⭐收藏一下?O(∩_∩)O文章来源地址https://www.toymoban.com/news/detail-725492.html

THANKS FOR WATCHING

到了这里,关于【数据结构】二叉树中的递归问题(超详细画图~)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • LeetCode算法递归类—二叉树中的最大路径和

    目录 124. 二叉树中的最大路径和 - 力扣(LeetCode) 题解: 代码: 运行结果: 二叉树中的  路径  被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中  至多出现一次  。该路径  至少包含一个  节点,且不一定经过根节点。 路径和

    2024年02月12日
    浏览(38)
  • 数据结构:完全二叉树(递归实现)

           如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。        完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编号为i,        当2*i = sum时,有左孩子,其编号为

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

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

    2024年02月01日
    浏览(40)
  • 数据结构:非完全二叉树(递归实现)

      非完全二叉树是指在二叉树中,除了叶子节点(无子节点)外,其他节点的子节点个数可以不同,即不一定是每个节点都有两个子节点,有右孩子时也不一定有左孩子。 tree.h tree.c main.c 结果

    2024年01月21日
    浏览(50)
  • 【数据结构】——二叉树的递归实现,看完不再害怕递归

     创作不易,感谢三连加支持?! 递归无非就是相信它,只有你相信它,你才能写好递归!为什么?请往下看 在进入二叉树的实现之前,我们得先理解一遍递归,可能很多人对于递归感到恐惧或者害怕, 有时候还不敢面对, 其实大可不必,  递归其实分为两个东西: 1.递归

    2024年04月09日
    浏览(39)
  • 【数据结构】二叉树的遍历递归算法详解

    我们来写一个函数 BuyNode(x)函数 用于创建二叉树结点。 用动态开辟函数 malloc 函数进行动态开辟,并强制转换为 BTNode 型,用变量 node 来去管理开辟的空间。 我们初始化结点,其 val 即为传入的参数x,左右指针 left 和 right 都设为NULL。 我们在主函数中创建上面这样一颗二叉树

    2024年01月20日
    浏览(46)
  • 数据结构 | 链式二叉树【递归的终极奥义】

    在上一节中,我们说到了一种数据结构——【堆】。也看到了一些有关二叉树的基本雏形,在本节中,我们就来说说有关这种链式二叉树的具体实现以及应用 首先来看看它的结构声明。结构体中有三个成员,一个是 当前结点的值 ,还有两个是指向当前结点 左孩子结点的指针

    2024年02月02日
    浏览(40)
  • 数据结构:二叉树的递归实现(C实现)

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 本篇博客主要讲解二叉树的相关操作如下: 树是一种非线性结构,它是由n个有限节点组成的一个有层次关系的集合。 图中 A节点 没有前驱节点,被称为根节点 除根节点外,其余节点被分成两个无不相交的集合T1(

    2024年02月12日
    浏览(36)
  • 数据结构:二叉树的基本操作(用递归实现)

             本文将通过完成以下内容来展示二叉树的基本操作,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~ 本文的内容为: 用递归的方法实现以下算法: 1.以二叉

    2024年02月06日
    浏览(50)
  • 数据结构---手撕图解二叉树(含大量递归图解)

    二叉树的几乎所有实现都是依靠递归实现,递归的核心思路是把任何一个二叉树看成根和左右子树,而二叉树递归的核心玩法就是把二叉树的左右子树再看成根,再找左右子树,再看成根… 因此,解决二叉树问题实际上要把二叉树转换成一个一个子树的过程,找到一个一个的

    2024年02月16日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包