今天的題目為113.Path SumII,題目再叫我們找出所有從根節點到葉子節點的路徑,這些路徑的節點值加總要剛好等於targetSum。
以下是程式碼與解說:
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> result = new ArrayList<>();
// 儲存所有符合條件的路徑
List<Integer> path = new ArrayList<>();
// 暫存目前走過的路徑
dfs(root, targetSum, path, result);
// 開始 DFS 遞迴
return result;
}
private void dfs(TreeNode node, int targetSum, List<Integer> path,
List<List<Integer>> result) {
if (node == null) return; // 若節點為 null,直接返回
path.add(node.val); // 將目前節點加入路徑
targetSum -= node.val; // 更新剩餘目標值
// 若是葉子節點,且剩餘目標值為 0,代表找到一條符合的路徑
if (node.left == null && node.right == null && targetSum == 0) {
result.add(new ArrayList<>(path)); // 加入結果(需複製 path)
}
// 遞迴探索左右子樹
dfs(node.left, targetSum, path, result);
dfs(node.right, targetSum, path, result);
path.remove(path.size() - 1); // 回溯:移除最後一個節點,準備探索其他路徑
}
}
今天的跟昨天的一樣,但多了要把每一條路徑都找出來,不只是一條而已。