判断一棵树是否为完全二叉树
如何判断一颗树是否是完全二叉树呢?
根据完全二叉树最后一层节点数量范围判断完全二叉树是不可靠的, 因为完全二叉树最后一层从左到右要求是连续的~
正确判断方法:层序遍历
如果是完全二叉树,那么当遍历遇到空节点之后,后面就没有非空节点了~
而非完全二叉树,那么当遍历遇到空节点之后,后面还有非空节点
层序遍历前面博客已经分享过了,核心就在于要借助队列,上一层出队列时带下一层进队列~
代码实现
//判断完全二叉树
bool BTreeComplete(BTNode* root)
{
Queue q;
QueueInit(&q);
if (root)
{
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)
{
QueueDestroy(&q);
return false;
}
}
QueueDestroy(&q);
//前面代码走完了都没有return,说明第一个空节点之后的节点均为空节点~
return true;
}
二叉树补充知识
补充一:
结论:任何一棵非空二叉树,如果度为0的节点个数为n0,度为2的节点个数为n2,则 n0 = n2+1
理解:
例1:
叶子节点就是度为0的节点,直接用结论,选B
例2:
解答:
总节点数 = n0+n1+n2 = 2n
因为 n0 = n2 + 1
所以 n0+n1+n0-1 = 2n => 2n0+n1-1 =2n
右边是偶数,且完全二叉树中n1只能是1或0,因此n1 = 1
推出n0 = n
*推论:偶数个节点的完全二叉树度为1的节点有1个,奇数个节点的完全二叉树度为0的节点有0个
补充二
题型:根据前序和中序或者根据后序和中序构建完全二叉树,然后就可以求出另外一种遍历顺序了~
技巧:前序和后序确定根,中序划分左右区间,前序正着看,后序倒着看
eg:
解答:
如果题上给的是后序和中序,方法类似,注意这时确定根的时候后序时是倒着看的~
本篇博客就分享到这了,二叉树也就暂告一段落了,接下来要分享的是各大排序算法,欲知后事如何,且听下回解说~