【初阶数据结构篇】链式结构二叉树(续)
文章目录
须知
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!
接上篇:【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)-CSDN博客
2.6 二叉树查找位置x的节点
- 分为左右子树查找,依次递推即可
- 结束条件为空:说明在这一路径上没有找到
- 进入第二个if,说明找到了直接返回结点指针
2.6.1 示例代码:
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示例代码:
void BinaryTreeDestory(BTNode** root)
{
if (*root == NULL)
{
return;
}
BinaryTreeDestory(&((*root)->left));
BinaryTreeDestory(&((*root)->right));
free(*root);
*root = NULL;
}
图解:
2.8 二叉树的层序遍历
层序遍历:对于树型结构,层序遍历就是按层从上到下,每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明:对于左边的二叉树,按层划分后可得到右边的分层结构。
简单来说就是从上到下从左往右打印节点中的数据。
实现层序遍历需要借助数据结构队列(先进先出)
先将根节点入队列, 出队列前打印根节点的数据,同时将根节点的左右孩子入队列,重复该过程,直至队列为空。
2.8.1 示例代码:
//层序遍历
//借助数据结构---队列
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 示例代码:
//判断二叉树是否为完全二叉树
//---队列
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
2.
在具有
2n
个结点的完全⼆叉树中,叶⼦结点个数为( )
A n
B n+1
C n-1
D n/2
完全二叉树只含有0/1个度为1的节点个数。
选A
3.3 题目3
3.
⼀棵完全⼆叉树的结点数位为
531
个,那么这棵树的⾼度为( )
A 11
B 10
C 8
D 12
选B
3.4 题目4
4.
⼀个具有
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
2. ⼆叉树的先序遍历和中序遍历如下:先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则⼆叉树根结点为()A EB FC GD H
根据先序遍历(根左右):
选A
4.3 题目3
3. 设⼀课⼆叉树的中序遍历序列: badce ,后序遍历序列: bdeca ,则⼆叉树前序遍历序列为 ____ 。A adbceB decabC debacD abcde
根据先序遍历规则:abcde
选D
4.4 题目4
4. 某⼆叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同⼀层从左到右)的序列为A FEDCBAB CBAFEDC DEFCBAD ABCDEF
根据层序遍历规则:FEDCBA
选A
相信通过这篇文章你对二叉数性质与遍历的有了进一步的了解。如果此篇文章对你学习数据结构(二叉树)有帮助,期待你的三连,你的支持就是我创作的动力!!!
下一篇文章再会!!!