力扣解題思路:958. 二叉樹的完全性檢驗 糾錯記錄
阿新 • • 發佈:2021-01-30
958. 二叉樹的完全性檢驗
思路:判斷一棵樹是否為完全二叉樹。
這題我有思路,首先就是BFS遍歷整顆數,然後存入佇列,從佇列頭部一個一個取出,如果遇到null則佇列中不可以再有節點了,有就代表不是完全二叉樹,於是有:
public boolean isCompleteTree(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
if (temp == null){
if(!queue.isEmpty()) return false;//錯在應該判斷佇列裡是不是有非空成員,因為佇列裡可能都是null!!
continue;
}
queue.add(temp.left);
queue.add(temp.right);
}
return true;
}
然後就錯了!!原因就在應該判斷佇列裡是不是有非空成員,因為佇列裡可能都是null!!所以直接在if (temp == null)中判斷佇列是否為空是不對的,應該判斷佇列中是否有非空成員,這樣就可以啦:
public boolean isCompleteTree(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
if (temp == null){
//if(!queue.isEmpty()) return false;//錯在應該判斷佇列裡是不是有非空成員,因為佇列裡可能都是null!!
if(!queue.isEmpty()){
while(!queue.isEmpty()){
if(queue.poll() != null) return false;
}
}
continue;
}
queue.add(temp.left);
queue.add(temp.right);
}
return true;
}
當然還有一種更巧妙的方法,設定一個標誌位,當遇到null時置位,如果再次進入迴圈並遍歷到非空元素時返回false:
public boolean isCompleteTree(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
boolean flag = false;
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
if (temp == null){
flag = true;
continue;
}
if (flag) return false;
queue.add(temp.left);
queue.add(temp.right);
}
return true;
}