完全二叉樹
子節點從左往右生長,一層生長完全纔可以生長下一層.
解題思路:
橫向遍歷(按層)二叉樹的過程中,每個節點的子節點有以下四種情況:
1-左右都沒有 : 該節點爲葉子節點
2-左右都有: 沒啥說的,一個沒什麼幺蛾子的節點.
3-有右沒左 : 出現這種情況直接返回false,這種情況違反完全二叉樹的定義
4-有左沒右 : 出現此種情況,證明該節點的左節點應該是最後一層的最後一個節點,其後面遍歷到的節點都必須是葉子節點.否則該樹不是完全二叉樹.
橫向遍歷二叉樹的思路:
將二叉樹的節點放入隊列中,彈出一個節將它的子節點先左後右壓入隊列中.直到隊列爲空.
整體代碼如下:
public static boolean isCBT(Node head){
if(head == null){
return true; //空節點是完全二叉樹
}
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
Node left = null;
Node right = null;
boolean isLeaf = false;
while(!queue.isEmpty()){
head = queue.poll();
left = head.left;
right = head.right;
//判斷是否是有右節點沒有左節點的情況 : (isLeaf && (left != null || right != null))
//判斷出現第四種情況(有右沒左)時,後邊的節點是不是都是葉節點 : (isLeaf && (left != null || right != null))
if((isLeaf && (left != null || right != null)) || (left == null && right != null)){
return false;
}
if(head.left != null){
queue.offer(left);
}else if(right != null){
queue.offer(right);
}else{
isLeaf = true;
}
}
return true;
}