完全二叉树:每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。
如果一个节点有右孩子没有左孩子,直接返回false。(判断条件1)
如果一个节点不是左右两个孩子都全(有左没右或左右都没有),则开启阶段,此时其余节点全是叶节点。(判断条件2)
否则不是完全二叉树。
public class IsCBT {
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value = data;
}
}
public static boolean isCBT(Node head){
if(head==null){
return true;
}
Queue<Node> queue = new LinkedList<>();
boolean leaf = false;
Node left = null;
Node right = null;
queue.offer(head);
while (!queue.isEmpty()){
head = queue.poll();
left = head.left;
right = head.right;
if((right!=null&&left==null)||(leaf&&(left!=null||right!=null))){
return false;
}
//前半句的意思是如果右孩子存在,左孩子不存在,返回false
//后半句的意思是当开启阶段,如果左右孩子都不为空,返回false.
if(left!=null){
queue.offer(left);
}
if (right!=null){
queue.offer(right);
}
if(left==null||right==null){ //当有一个节点左孩子或右孩子为空时,开启阶段。
leaf = true;
}
}
return true;
}
}
总结:找好判断条件,则问题迎刃而解。