根據完全二叉樹的定義,如果二叉樹上某個結點有右孩子無左孩子則一定不是完全二叉樹;否則如果二叉樹上某個結點有左孩子而沒有右孩子,那么該結點所在的那一層上,該結點右側的所有結點應該是葉子結點,否則不是完全二叉樹。
import java.util.LinkedList;
import java.util.Queue;
public class tmp {
public static class Node{ //一個靜態內部類
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
}
public static boolean isCompleteBtree(Node root) {
if(root == null) {
return true;
}
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
boolean leaf = false;
while(!queue.isEmpty()) {
Node node = queue.poll();
//左空右不空
if(node.left == null && node.right != null) {
return false;
}
//如果開啟了葉子結點階段,結點不能有左右孩子
if(leaf && (node.left != null || node.right != null)) {
return false;
}
//將下一層要遍歷的加入到隊列中
if(node.left != null) {
queue.offer(node.left);
}
if(node.right != null) {
queue.offer(node.right);
} else {
leaf = true;
}
}
return true;
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.right = new Node(4);
System.out.println(isCompleteBtree(root));
}
}