import java.util.LinkedList;
import java.util.Queue;
public class Main446_isCompleteBinaryTree{
/* 判断一颗树是否为完全二叉树
* (1): 结点有右孩子无左孩子 return false;
* (2): 有左孩子无右孩子、左右孩子都无,后面遍历到的所有的的结点都必须是叶子结点,
* 否则一定不是完全二叉树.
*/
// 创建结点内部类
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<Node>();
// 用来判断是否为叶子结点
boolean bleft = false;
Node l = null;
Node r = null;
queue.offer(head);
while(!queue.isEmpty()) {
head = queue.poll();
l=head.left;
r=head.right;
// 已经判断为该结点为叶子结点,则左右孩子都为null,否则 return false;
if( (bleft && (l != null || r != null))
// 或者: 左节点为null,右节点不为null,则 return false;
|| (l == null && r!=null) ){
return false;
}
if(l != null) {
queue.offer(l);
}
if(r != null) {
queue.offer(r);
}
// else包含: 左null右null、 左不null右null。则后续结点均为叶子结点。
else {
bleft = true;
}
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}