給定一棵二叉樹和目標值 sum,判斷是否存在從根節點到葉節點的路徑,使得路徑上所有節點值之和等於 sum。
深度優先搜索,遞歸參數為當前節點和剩餘目標值。到達葉節點時檢查剩餘值是否等於該節點值。
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (!root) return false;
return dfs(root, sum);
}
bool dfs(TreeNode* root, int sum) {
if (!root) return false;
if (!root->left && !root->right) // 葉節點
return sum == root->val;
return dfs(root->left, sum - root->val) || dfs(root->right, sum - root->val);
}
};
bool hasPathSum(TreeNode* root, int sum) {
if (!root) return false;
stack<pair<TreeNode*, int>> st;
st.emplace(root, sum - root->val);
while (!st.empty()) {
auto [node, cur] = st.top(); st.pop();
if (!node->left && !node->right && cur == 0) return true;
if (node->right) st.emplace(node->right, cur - node->right->val);
if (node->left) st.emplace(node->left, cur - node->left->val);
}
return false;
}
此題是樹形 DP / DFS 入門經典,掌握遞歸與迭代兩種寫法,面試常考。