- 二叉树的完全性检验
给定一个二叉树,确定它是否是一个完全二叉树。
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)
。
又是层序遍历的应用,我看题解里还有别的很多解法,待我后面学了再回来看这道题
//! 检验二叉树是否为完全二叉树
//! 层序遍历每一个结点,有三种情况,分情况讨论
bool BinarySearchTreesZH::isCompleteTree(Node *node)
{
if (node == nullptr)
{
return false;
}
queue<Node *> list;
list.push(node);
while (list.size() != 0)//! 大遍历
{
Node *front = list.front();
if (front->left != nullptr && front->right != nullptr)//! 若该结点同时拥有左右子结点,则继续出队入队
{
list.pop();
if (front->left != nullptr)
{
list.push(front->left);
}
if (front->right != nullptr)
{
list.push(front->right);
}
}
else if (front->left == nullptr && front->right != nullptr)//! 若该结点没有左只有右,直接返回false
{
return false;
}
else//! 若该结点没有左右子结点,或只有左子结点,则子节点入队后,队列该结点后面所有结点都是叶结点(没有子节点)
{
if (front->left != nullptr)
{
list.push(front->left);
}
list.pop();//把当前符合规则的这个先pop出去
while (list.size() != 0)//检验后面的是不是都是叶结点,若不是return false
{
front = list.front();
if (front->left != nullptr || front->right != nullptr)
{
return false;
}
list.pop();
}
}
}
//每次检验都通过,返回true
return true;
}