一个二叉树的节点有四种情况:
- 有左右孩子节点。 -----> 很好的一种状态。
- 有左孩子节点,无右孩子节点。 -----> 这一种情况很难判定。第一次碰到这种情况时作为阶段的改变的标志。
- 无左孩子节点,有右孩子节点, -----> 完全二叉树里面不能出现的情况。
- 没有左右孩子节点。 -----> 叶子节点。
按二叉树的层次遍历,一旦出现3)的情况,就不是完全二叉树。还有一种情况,就是当出现2)或者4)的情况之后,就要求接下来的所有节点都必须是叶子节点了,如果不是叶子节点,则不是完全二叉树。
public boolean isCBT(Node root) {
if(root==null) return true;
Queue<Node> queue=new LinkedList<>();
queue.offer(root);
Node l;
Node r;
boolean leaf=false; //作为标志,标志遍历阶段是否进入【同时没有左右孩子阶段】的时候了。
while(!queue.isEmpty()){
Node node = queue.poll();
l=node.left;
r=node.right;
if(l==null&&r!=null) return false; // 没有左孩子却有右孩子
if(leaf&&(l==null||r!=null)) return false;
if(l!=null) queue.offer(l);
if(r!=null) queue.offer(r);
if(l==null||r==null) leaf=true; //进入新的阶段
}
return true;
}