給定二叉樹根節點 root 和目標和 sum,找出所有從根節點到葉子節點的路徑,使得路徑上節點值之和等於 sum。返回所有滿足條件的路徑列表。
示例:
輸入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], sum = 22
輸出:[[5,4,11,2], [5,8,4,5]]
path(值類型傳遞,自動回溯)path 加入結果集class Solution {
public:
vector> pathSum(TreeNode* root, int sum) {
vector> res;
vector path;
dfs(root, sum, path, res);
return res;
}
private:
void dfs(TreeNode* node, int sum, vector& path, vector>& res) {
if (!node) return;
path.push_back(node->val);
if (!node->left && !node->right) { // 葉子節點
if (node->val == sum) res.push_back(path);
} else {
dfs(node->left, sum - node->val, path, res);
dfs(node->right, sum - node->val, path, res);
}
path.pop_back(); // 回溯
}
};
path 用引用傳遞並在調用前後 push_back/pop_back,避免每層遞歸拷貝向量,空間 O(h)!left && !right,非葉子節點不判斷和sum - node->val,葉子處直接比較 node->val == sum,邏輯清晰vector> pathSum(TreeNode* root, int sum) { vector > res; if (!root) return res; stack >> st; st.emplace(root, sum, vector ()); while (!st.empty()) { auto [node, rem, path] = st.top(); st.pop(); path.push_back(node->val); if (!node->left && !node->right && node->val == rem) res.push_back(path); if (node->right) st.emplace(node->right, rem - node->val, path); if (node->left) st.emplace(node->left, rem - node->val, path); } return res; }
注意:迭代版 path 為值傳遞(每次入棧拷貝),空間較大,但避免遞歸棧溢出風險。
Path Sum II 是經典樹形 DP/回溯問題。遞歸版代碼簡潔、符合直覺,工程首選;迭代版適合深度極大場景。核心模式:DFS + 路御記錄 + 葉子判斷 + 回溯,可擴展至路御和、路御乘積、路御字符串等變體。