給定一棵二叉樹和一個目標和 sum,找出所有從根節點到葉子節點路徑總和等於目標和的路徑。
範例:
給定二叉樹:
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
sum = 22
返回:
[
[5,4,11,2],
[5,8,4,5]
]
使用前序遍歷(根-左-右),維護一條當前路徑 path 和剩餘目標和 remaining:
path,更新 remaining -= node.val。remaining == 0,將 path 加入結果集。path 移除當前節點值。/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> result;
vector<int> path;
dfs(root, sum, path, result);
return result;
}
private:
void dfs(TreeNode* node, int remaining, vector<int>& path, vector<vector<int>>& result) {
if (!node) return;
path.push_back(node->val);
if (!node->left && !node->right && node->val == remaining) {
result.push_back(path);
}
dfs(node->left, remaining - node->val, path, result);
dfs(node->right, remaining - node->val, path, result);
path.pop_back(); // 回溯
}
};