【初阶数据结构篇】链式结构二叉树(续)

文章目录

须知

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!

🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

接上篇:【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)-CSDN博客

2.6 二叉树查找位置x的节点
  • 分为左右子树查找,依次递推即可
  • 结束条件为空:说明在这一路径上没有找到
  • 进入第二个if,说明找到了直接返回结点指针
2.6.1 示例代码:
cpp 复制代码
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}

	BTNode* leftFind = BinaryTreeFind(root->left, x);
	if (leftFind)
	{
		return leftFind;
	}
	BTNode* rightFind = BinaryTreeFind(root->right, x);
	if (rightFind)
	{
		return rightFind;
	}
	return NULL;
}
2.7 二叉树的销毁
2.7.1示例代码:
cpp 复制代码
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&((*root)->left));
	BinaryTreeDestory(&((*root)->right));

	free(*root);
	*root = NULL;
}

图解:

2.8 二叉树的层序遍历

层序遍历:对于树型结构,层序遍历就是按层从上到下,每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明:对于左边的二叉树,按层划分后可得到右边的分层结构。

简单来说就是从上到下从左往右打印节点中的数据。

实现层序遍历需要借助数据结构队列(先进先出)

先将根节点入队列, 出队列前打印根节点的数据,同时将根节点的左右孩子入队列,重复该过程,直至队列为空。

2.8.1 示例代码:
cpp 复制代码
//层序遍历
//借助数据结构---队列
void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		//取队头,打印
		BTNode* front = QueueFront(&q);
		printf("%d ", front->data);
		QueuePop(&q);
		//队头节点的左右孩子入队列
		if (front->left)
			QueuePush(&q, front->left);
		if (front->right)
			QueuePush(&q, front->right);
	}
	//队列为空
	QueueDestroy(&q);
}
2.9 完全二叉树的判断

取队头,左右节点全入队列,当取出对头为空,跳出循环。

进入第二个循环判断剩下的队列是否有非空节点

有则为非完全二叉树,反之亦然。

2.9.1 示例代码:
cpp 复制代码
//判断二叉树是否为完全二叉树
//---队列
bool BinaryTreeComplete(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front == NULL)
		{
			break;
		}
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}
	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}
	QueueDestroy(&q);
	return true;
}
3. 二叉树性质选择题

二叉树性质

对任何⼀棵⼆叉树, 如果度为 0 其叶结点个数为 n 0 , 度为 2 的分⽀结点个数为 n 2 ,则有
n 0 = n 2 + 1.

证明:


假设⼀个⼆叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点,则这个⼆叉树的边数是
2a+b
另⼀⽅⾯,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1
结合上⾯两个公式:
2a+b = a+b+c-1 ,即a=c-1。

3.1 题目1
  1. 某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )
    A 不存在这样的⼆叉树
    B 200
    C 198
    D 199
    选B
    根据上述二叉树性质
    n0=n2+1即n0=199+1=200
3.2 题目2
  1. 在具有 2n 个结点的完全⼆叉树中,叶⼦结点个数为( )
    A n
    B n+1
    C n-1
    D n/2
    完全二叉树只含有0/1个度为1的节点个数。

    选A
3.3 题目3
  1. ⼀棵完全⼆叉树的结点数位为 531 个,那么这棵树的⾼度为( )
    A 11
    B 10
    C 8
    D 12

    选B
3.4 题目4
  1. ⼀个具有 767 个结点的完全⼆叉树,其叶⼦结点个数为()
    A 383
    B 384
    C 385
    D 386

选B

4 二叉树遍历选择题
4.1 题目1
  1. 某完全⼆叉树按层次输出(同⼀层从左到右)的序列为 ABCDEFGH 。该完全⼆叉树的前序序列为(

    A ABDHECFG
    B ABCDEFGH
    C HDBEAFCG
    D HDEBFGCA

选A

4.2 题目2
  1. ⼆叉树的先序遍历和中序遍历如下:先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则⼆叉树根结点为
    ()
    A E
    B F
    C G
    D H

根据先序遍历(根左右):

选A

4.3 题目3
  1. 设⼀课⼆叉树的中序遍历序列: badce ,后序遍历序列: bdeca ,则⼆叉树前序遍历序列为 ____ 。
    A adbce
    B decab
    C debac
    D abcde

根据先序遍历规则:abcde

选D

4.4 题目4
  1. 某⼆叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同⼀层从左到右)
    的序列

    A FEDCBA
    B CBAFED
    C DEFCBA
    D ABCDEF

根据层序遍历规则:FEDCBA

选A

相信通过这篇文章你对二叉数性质与遍历的有了进一步的了解。如果此篇文章对你学习数据结构(二叉树)有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会!!!

相关推荐
MinBadGuy15 分钟前
【GeekBand】C++设计模式笔记10_Prototype_原型模式
c++·设计模式·原型模式
GeekAlice36 分钟前
算法笔记/USACO Guide GOLD金组Graphs并查集Disjoint Set Union
c++·经验分享·笔记·学习·算法
阿巴~阿巴~42 分钟前
C_数据结构(单链表算法题) —— 相交链表、环形链表I、环形链表II、随机链表的复制
c语言·开发语言·数据结构·算法·链表·1024程序员节
yangpipi-1 小时前
数据结构(C语言版)-2.栈和队列
c语言·开发语言·数据结构
bcbobo21cn1 小时前
C语言不创建中间变量交换2个数
数据结构·异或·交换2数
阿七想学习1 小时前
数据结构《链表》
java·开发语言·数据结构·学习·链表
_OLi_1 小时前
力扣 LeetCode 977. 有序数组的平方(Day1:数组)
数据结构·算法·leetcode
三小尛2 小时前
希尔排序(C语言)
c语言·数据结构·排序算法
風清掦2 小时前
C/C++每日一练:编写一个查找子串的位置函数
c语言·c++·算法
WolvenSec2 小时前
C/C++逆向:结构体逆向分析
c语言·开发语言·c++·网络安全