104. Maximum Depth of Binary Tree

Borris發表於2019-10-07

此題是一道簡單題,目的是為了開始釐清 DFS 和 BFS 演算法的思路。

解法一 DFS

思路

首先想到如果給的陣列是 null 則返回深度為零。可以這麼想:一個節點的深度,就是它的 left child 和 right child 中深度較大的那個加一。

程式碼
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            return Math.max(left, right) + 1;
        }
    }
}
複雜度分析
  • 時間複雜度
    • 所有結點都會經過一次, O(N)
  • 空間複雜度 O(1)
    • 最好情況: N 個節點形成了完全二叉樹,recursion 執行 O(logN) 次
    • 最壞情況: N 個節點都只有左孩子,recursion 執行 O(N) 次

解法二 Iteration

思路

使用 Stack 的 DFS。
對於一個節點,如果存在左節點或右節點,那麼入棧,深度加一。
下一次 iteration 時,把入棧的節點彈出,查詢該節點是否還有子節點。
有的話入棧,深度加一。沒有就不用操作了,只是將這個節點出棧。
iteration 的過程直到棧中沒有任何節點為止。

程式碼
class solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }

        LinkedList<TreeNode> stack = new LinkedList<>();
        LinkedList<Integer> level = new LinkedList<>();

        // Initialize the LinkedList
        stack.push(root);
        level.push(1);
        // Set the template to store node and max depth
        TreeNode temp;
        int curr_level, maxDepth = 0;
        while (!stack.isEmpty()) {
            temp = stack.pop(); // get the latest node in the stack
            curr_level = level.pop(); // get the corresponding depth of the node
            maxDepth = Math.max(maxDepth, curr_level); // 始終保持 max 最大

            if (temp.left != null) {
                stack.push(temp.left);
                level.push(curr_level+1);
            }

            if (temp.right != null) {
                stack.push(temp.right);
                level.push(curr_level+1);
            }           
        }
        return maxDepth;
    }
}

Takeaway

  • 在此過程中,發現 LinkedList 同時具備 queue 和 stack 的功能。但需要建立時注意,使用 LinkedList 開頭,不能使用 list。因為 List 介面中沒有 push, add, poll 等方法。
    • 對 Linkedlist 介面方法的總結:
      • 從 List 繼承而來的: add() - 直接在 LinkedList 末端加入元素; remove() - 移除頂部元素; add(1, element) - 在 index = 1 的地方加入元素; set(1, element) - 在 index = 1 的地方替換元素
      • LinkedList 自帶方法: push() - 推入棧頂; pop(), poll()- 從棧頂出棧; pollLast(), pollFirst(), removeLast(); removeFirst() 顧名思義。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章