LeetCode 104. Maximum Depth of Binary Tree

Borris發表於2020-02-18

解法一 Recursion

思路

使用一個 global variable - max 來記錄最大的深度,並在 DFS 遞迴函式中持續更新 max 的值。但由於 int 型別的變數在函式呼叫中是 pass by value 的,所以我用一個整型陣列來儲存最大的那個值,這樣數值就可以在函式呼叫中傳遞了。

我使用了中序遍歷來實現 DFS。

程式碼
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int[] max = new int[1];
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        findDepth(1, root);
        return max[0];
    }

    private void findDepth(int depth, TreeNode node) {
        if (node == null) {
            return;
        }

        findDepth(depth + 1, node.left);
        max[0] = Math.max(max[0], depth);
        findDepth(depth + 1, node.right);
    }
}
複雜度分析
  • 時間複雜度
    • O(n),因為遍歷了樹的所有元素。
  • 空間複雜度
    • O(H),取決於樹的高度。

解法二 Iteration

思路

簡單來說就是做一個 level-order traversal, 最後記錄最後一層的層數。

程式碼
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int level = 0;
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            level++;
        }

        return level;
    }
}
複雜度分析
  • 時間複雜度
    • O(n),BFS 遍歷了每一個元素
  • 空間複雜度
    • O(n),keep the nodes in the tree
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章