LeetCode 112. Path Sum

Borris發表於2020-02-20

解法一 Recursive

思路

我們要找到到達葉子節點時,該路徑的值是否等於sum。同時,還要檢查左子樹和右子樹是否有這樣的值。只要有,就可以返回true。

程式碼
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) return false;
        sum -= root.val; // 對每一層的節點,sum 相應減少
        if (root.left == null && root.right == null) {
            return sum == 0; // 到葉子節點時,檢查 sum 是否為0
        }

        // 只要左子樹和右子樹有至少一組解即可
        return hasPathSum(root.left) || hasPathSum(root.right);
    }
}
複雜度分析
  • 時間複雜度
    • O(N)
  • 空間複雜度
    • O(H) – 取決於樹的高度

解法二 Iteration

思路

利用兩個棧,儲存每一層節點的值和對應的剩餘 sum 值。到葉子節點時,sum 的值如果出現 0,那麼這個路徑有解。

程式碼
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) return false;

        Stack<TreeNode> tree_stack = new Stack<>();
        Stack<Integer> sum_stack = new Stack<>();
        tree_stack.push(root);
        sum_stack.push(sum - root.val);
        while (!tree_stack.isEmpty()) {
            TreeNode node = tree_stack.pop();
            int curr_sum = sum_stack.pop();

            if (node.left == null && node.right == null && curr_sum == 0) {
            return true;
            }

            if (node.left != null) {
                tree_stack.push(node.left);
                sum_stack.push(curr_sum - node.left.val);
            }

            if (node.right != null) {
                tree_stack.push(node.right);
                sum_stack.push(curr_sum - node.right.val);
            }
        }
        return false;
    }
}
複雜度分析
  • 時間複雜度
    • O(n) 遍歷了所有節點
  • 空間複雜度
    • O(H)

Takeaway

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章