度不为2的节点这里认为是非满节点,也就是左右子树至少有一个为空,即
root->left == NULL 或 root->right == NULL 则判断完全二叉树的一种
算法思想如下:
按层序遍历二叉树,若遇到首个非满节点,则后面所有节点必为叶子节点,否则非完全二叉树。可以通过设置一个布尔型变量flag,在层序遍历左右子树入队前先判断是否遇到了非满节点,若已遇到,若为完全二叉树则当前节点应为叶子节点,这与当前节点具有左子树不符,返回false,
算法代码如下:
bool judgeCBT(TreeNode* root){
if(!root) return true;
queue<TreeNode* > q;
q.push(root);
bool flag = false; //尚未开始遍历,何谈遇到非满节点,flag自然置为false;
while(!q.empty()){ //层序遍历开始
TreeNode* curr = q.front();
q.pop();
if(curr->left){ //左子树非空
if(flag == true) return false; //flag为true说明已遇到过非满节点,当前节点应当为叶子节点,不应该有左子树,非完全二叉树
q.push(curr->left);
}else //左子树为空,说明遇到了非满节点,置flag为true
flag = true;
if(curr->right){ //右子树非空
if(flag == true) return false; //flag为true说明已遇到过非满节点,当前节点应当为叶子节点,不应该有右子树,非完全二叉树
q.push(curr->right);
}else //右子树为空,说明遇到了非满节点,置flag为true
flag = true;
} //到这里层次遍历完成,且尚未返回false
return true; //那必然为完全二叉树
}