# 路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum

叶子节点 是指没有子节点的节点。

 

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false

示例 3:

输入:root = [1,2], targetSum = 0
输出:false

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} }; ``` ### after ```cpp ``` ## 答案 ```cpp 其他三个都是错的 ``` ## 选项 ### A ```cpp class Solution { public: bool hasPathSum(TreeNode *root, int sum) { if (root == NULL) { return false; } vector node_stack; vector sum_stack; node_stack.push_back(root); sum_stack.push_back(sum - root->val); TreeNode *node; int curr_sum; while (!node_stack.empty()) { node = node_stack.back(); node_stack.pop_back(); curr_sum = sum_stack.back(); sum_stack.pop_back(); if ((node->right == NULL) && (node->left == NULL) && (curr_sum == 0)) { return true; } if (node->right != NULL) { node_stack.push_back(node->right); sum_stack.push_back(curr_sum - node->right->val); } if (node->left != NULL) { node_stack.push_back(node->left); sum_stack.push_back(curr_sum - node->left->val); } } return false; } }; ``` ### B ```cpp class Solution { public: bool hasPathSum(TreeNode *root, int sum) { if (root == NULL) return false; stack> s; s.push(make_pair(root, sum)); TreeNode *node = root; int currSum; while (!s.empty()) { node = s.top().first; currSum = s.top().second; s.pop(); if (node->left == NULL && node->right == NULL && node->val == currSum) return true; if (node->right) s.push(make_pair(node->right, currSum - node->val)); if (node->left) s.push(make_pair(node->left, currSum - node->val)); } return false; } }; ``` ### C ```cpp class Solution { public: bool hasPathSum(TreeNode *root, int sum) { if (!root) return false; if (!root->left && !root->right && root->val == sum) return true; return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); } }; ```