Weekly Contest 115的 二叉樹的徹底性檢驗:node
給定一個二叉樹,肯定它是不是一個徹底二叉樹。spa
百度百科中對徹底二叉樹的定義以下:code
若設二叉樹的深度爲
h
,除第h
層外,其它各層 (1~h-1
) 的結點數都達到最大個數,第 h 層全部的結點都連續集中在最左邊,這就是徹底二叉樹。(注:第h
層可能包含1~ 2h
個節點。)blog示例1:
隊列
輸入:[1,2,3,4,5,6] 輸出:true 解釋:最後一層前的每一層都是滿的(即,結點值爲 {1} 和 {2,3} 的兩層),且最後一層中的全部結點({4,5,6})都儘量地向左。示例2:
leetcode
輸入:[1,2,3,4,5,null,7] 輸出:false 解釋:值爲 7 的結點沒有儘量靠向左側。提示:get
- 樹中將會有
1
到100
個結點。
本題基本沒有難度,且在徹底二叉樹的百度百科中已經給出了思路:it
判斷一棵樹是不是徹底二叉樹的思路io
- 若是樹爲空,則直接返回
false
若是樹不爲空:層序遍歷二叉樹class
- 若是一個結點左右孩子都不爲空,則
pop
該節點,將其左右孩子入隊列;- 若是遇到一個結點,左孩子爲空,右孩子不爲空,則該樹必定不是徹底二叉樹;
- 若是遇到一個結點,左孩子不爲空,右孩子爲空;或者左右孩子都爲空;則該節點以後的隊列中的結點都爲葉子節點;該樹纔是徹底二叉樹,不然就不是徹底二叉樹;
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } * 958. 二叉樹的徹底性檢驗 * @param root * @return */ public boolean isCompleteTree(TreeNode root) { boolean flag=true; //左子樹的標誌位 boolean isLeft=false; if(root!=null){ Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); while (queue.size()!=0){ TreeNode node=queue.poll(); TreeNode left=node.left; TreeNode right=node.right; if((left==null && right!=null)//左節點爲null,且右節點不爲null(是否爲葉子節點) || (isLeft && (left!=null || right!=null))){//若是爲左子樹,則左右節點都不能爲null flag=false; break; } if(left!=null){ queue.offer(left); } if(right!=null){ queue.offer(right); }else{ isLeft=true; } } }else{ flag=false; } return flag; }