二叉树之结点相关操作

news/2025/2/22 14:03:20

文章目录

  • 结点的个数
    • 代码实现
    • 图解递归
  • 叶子结点的个数
    • 代码实现
    • 图解递归
  • 第k层结点的个数
    • 代码实现
    • 图解递归
  • 值为x的结点
    • 代码实现
    • 图解递归

结点的个数

求解树的结点总数时,可以将问题拆解成子问题:
1.若为空,则结点个数为0。
2.若不为空,则结点个数 = 左子树结点个数 + 右子树结点个数 + 1(自己)。

代码实现

int BinaryTreeSize(BT* root)
{
	//结点个数 = 左子树的结点个数 + 右子树的结点个数 + 自己
	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

图解递归

在这里插入图片描述

当你自己画完其递归过程后,你会发现其实它就相当于后序遍历,BinaryTreeSize(root->left)相当于左子树,BinaryTreeSize(root->right)相当于右子树,而最后加的那个1,其实就是根结点。


叶子结点的个数

子问题拆解:
1.若为空,则叶子结点个数为0。
2.若结点的左指针和右指针均为空,则叶子结点个数为1。
3.除上述两种情况外,说明该树存在子树,其叶子结点个数 = 左子树的叶子结点个数 + 右子树的叶子结点个数。

代码实现

int BinaryTreeLeafSize(BT* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL&&root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

图解递归

在这里插入图片描述

这里要注意,root==NULL这个必须写在最前面,不能写在后面,因为万一是空树的情况,那样你root->left访问就会出问题。


第k层结点的个数

思路:
相对于根结点的第k层结点的个数 = 相对于以其左孩子为根的第k-1层结点的个数 + 相对于以其右孩子为根的第k-1层结点的个数

在这里插入图片描述

代码实现

int BinaryKlevelSize(BT* root,int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BinaryKlevelSize(root->left, k - 1) + BinaryTreeKLevelSize(root->right, k - 1);
}

图解递归

在这里插入图片描述


值为x的结点

子问题:
1.先判断根结点是否是目标结点。
2.再去左子树中寻找。
3.最后去右子树中寻找。

代码实现

BT* BinaryTreeFind(BT* root,BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->x == x)
	{
		return root;
	}
    struct BinaryNode* ansleft = BinaryTreeFind(root->left, x);
	if (ansleft)
	{
		return ansleft;
	}
	struct BinaryNode* ansright = BinaryTreeFind(root->right, x);
	if (ansright)
	{
		return ansright;
	}
	return NULL;
}

这块代码其实是很容易写出一个编译器的Bug的,读者不防试试把前面两个if的{}去掉试试看,此时你就会发现一个编译器的Bug。
关于这个问题读者们有兴趣的话可以去看看我写的这篇文章:💥不经意之间的Bug(1):有些编译器可能在某些情况下无法识别typedef定义的标识符

图解递归

在这里插入图片描述



http://www.niftyadmin.cn/n/1697206.html

相关文章

远程桌面命令是什么 如何使用命令连接远程桌面

对于需要远程管理对方电脑已经服务器的朋友来说,通常需要使用到远程桌面连接对反电脑操作。但对于一些初识网络的朋友来说,可能对远程桌面命令并不了解。最近有一电脑爱好者朋友就请教小编如何远程桌面命令,接下来小编为其演示下,…

#define 与 do{}while(0)的合用

本博客链接来自 https://blog.csdn.net/msdnwolaile/article/details/50721954 转载于:https://www.cnblogs.com/exploer/p/9744651.html

二叉树初阶OJ题(内附递归图解,思路)(建议收藏!!!)

文章目录1.单值二叉树解题思路代码实现图解递归2.二叉树的最大深度解题思路代码实现图解递归3.翻转二叉树解题思路思路1:代码实现思路2:代码实现图解递归解法1递归分析解法二图解递归4.对称二叉树解题思路代码实现图解递归5.两个树是否相同解题思路代码实…

第1次作业

1.本章学习总结(c语言分支顺序结构) 1.1 思维导图 1.2.1 学习体会 体会与心得:这章是我刚开始认识c的第一章,也是我漫漫代码路的第一步,从这一章中我学会了一些简单程序的编程和顺序与分支结构的一些简单的应用。这几…

排序算法学习(1)(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

文章目录直接插入排序代码实现复杂度的计算希尔排序希尔排序的预排序代码实现选择排序代码实现堆排序冒泡排序代码实现💢 注:以下排序都是以排升序为例。 直接插入排序 直接插入排序的主要思路就是: 1.首先默认第一个元素是有序的。 2.然后将…

5-9 亮度增强

实现一个最简单的美白效果:亮度增强。最简单的亮度增强,最简单的美白算法。 # p p40 import cv2 import numpy as np img cv2.imread(image0.jpg,1) imgInfo img.shape height imgInfo[0] width imgInfo[1] cv2.imshow(src,img) dst np.zeros((hei…

文字、字符

文字、字符 是人类可以阅读的信息。 原始信息:bytes,计算机可以阅读的信息。

排序算法学习(2)(快速排序,归并排序,计数排序)(详细解析,建议收藏!!!)

文章目录快速排序递归实现Hoare版本代码实现递归图解挖坑法代码实现递归图解前后指针法代码实现递归图解非递归实现Hoare版本挖坑法前后指针法非递归快排代码实现图解代码快速排序的两个优化1.三数取中代码实现2.小区间的优化代码实现归并排序递归实现递归图解区间划分要注意&a…