解法一 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 協議》,轉載必須註明作者和本文連結