問題描述:判斷一棵二叉樹是否為完全二叉樹。
知識點:完全二叉樹是指除二叉樹的最后一層外,其他各層的節點數達到最大個數,且最后一層的葉節點從左到右連續存在,只缺右側若干節點。
算法實現:
class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
//is complete binary tree
public static boolean isCBT(Node head) {
if(head == null) {
return true;
}
Queue<Node> queue = new LinkedList<>();
boolean leaf = false;
Node leftN = null;
Node rightN = null;
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
leftN = head.left;
rightN = head.right;
if((leftN == null && rightN != null) || (leaf && (leftN != null || rightN != null))) {
return false;
}
if(leftN != null) {
queue.offer(leftN);
}
if(rightN != null) {
queue.offer(rightN);
} else {
leaf = true;//葉子節點開始標志,若為“完全二叉樹”則之后的待處理的節點都應為葉子節點
}
}
return true;
}
算法解析:
1.按層遍歷二叉樹,從每層的左邊向右邊依次遍歷;
2.如果當前節點有右孩子,但沒有左孩子,直接返回false;
3.如果當前節點並不是左右孩子都有,那之后的節點應都為葉節點,否則返回false;
4.設置初始標志位true, 如果遍歷結束沒有返回false,則為完全二叉樹,返回最終結果true。