完全二叉树(CBT,Complete Binary Tree):①某个节点有右孩子没有左孩子,则不是完全二叉树;②满足①的条件下,某个节点没有右孩子,有左孩子,或者没有左右孩子时,后面遇到的所有节点必须是叶节点。
import java.util.LinkedList;
import java.util.Queue;
public class e06IsCBT {
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> q = new LinkedList<>();
q.add(head);
Node l = null;
Node r = null;
Node temp = null;
boolean leaf = false;
while (!q.isEmpty()) {
temp = q.poll();
l = temp.left;
r = temp.right;
/**
* 判断完全二叉树的两个标准:①某个节点有右孩子没有左孩子,则不是完全二叉树
* ②满足①的条件下,某个节点没有右孩子有左孩子,或者没有左右孩子时,后面遇到的所有节点必须是叶节点。
*/
if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
return false;
}
if (l != null) {
q.add(l);
}
if (r != null) {
q.add(r);
}
if (l == null || r == null) {
leaf = true;
}
}
return true;
}
}