首先,我们要知道什么是满二叉树。一个深度为k,节点个数为 2^k – 1 的二叉树为满二叉树。这个概念很好理解。
那么,我们要怎么判断一棵树是否为满二叉树呢?
思路:在层序遍历的过程中,找到第一个非满节点(non-full node)。满节点(full-node)指的是同时拥有左右孩子的节点。在找到第一个非满节点之后,剩下的节点不应该有孩子节点;如果有,那么该二叉树就不是完全二叉树。
<span style="font-size:18px;">bool isCompleteTree(Node* root){
queue<Node*> que;
que.push(root);
bool flag = false;
while(!que.empty()){
Node* temp = que.front();
que.pop();
if(flag){
if(temp->left || temp->right) //
return false;
}
else{
if(temp->left && temp->right) //左右孩子同时存在,则压入队列
{
que.push(temp->left);
que.push(temp->right);
}
else if(temp->right) //如果只存在右孩子,则,一定不满足满二叉树
return false;
else if(temp->left)
{
que.push(temp->left); //改变标志位
flag = true;
}
else
flag = true;
}
}
return true;
} </span>
网友还曾说,可以根据完全二叉树的定义,左边的深度>=右边的深度。从根节点开始,分别沿着最左最右分支下去,找到最左和最右的深度。如果左边比右边深1,再分别检查以左儿子和右儿子为根的两根树。但是尝试了几遍,感觉不对,但是,读者可以自己寻找。