判断一颗树是否为完全二叉树
算法思想:
完全二叉树规则:
- 遍历到任何一个节点,有右孩子没有左孩子直接返回false
- 不违反1的情况下,当前节点左右两个孩子不全,从当前节点开始所有的节点均为叶子节点。
我们定义一个队列层序遍历二叉树,定义一个bool类型的变量,表示是否到达一个节点,这个节点的左右孩子不全,那么以后的节点就全为叶子节点。若不满足,则不是完全二叉树。
也就类似于下图:
代码实现:
bool isCBTree(Node* head)
{
if(head == nullptr)
return true;
queue<Node*> q;
bool leaf = false;
q.push(head);
while(!q.empty())
{
Node* tmp = q.front();
q.pop();
Node* left = head->left;
Node* right = head->right;
//第一种情况是,已经开启叶节点了(leaf == true),之后的若要不是叶节点,则return false
//第二种情况是,有右孩子,没有左孩子 return false
if(leaf && (left != nullptr || right != nullptr) ||
(left == nullptr && right != nullptr))
return false;
if(left != nullptr)
q.push(left);
if(right != nullptr)
q.push(right);
if(left == nullptr || right == nullptr) //如果两个孩子中有一个为空,说明以后的全是叶节点
leaf = true;
}
return true;
}