1. 程式人生 > 其它 >力扣解題思路:958. 二叉樹的完全性檢驗 糾錯記錄

力扣解題思路:958. 二叉樹的完全性檢驗 糾錯記錄

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;
    }