本题题目要求如下:
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:Given the below binary tree and
sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2
which sum is 22.
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if (root == NULL)
return false;
dfs(root, sum);
return flag;
}
private:
bool flag = false;
void dfs(TreeNode* root, int sum) {
/* leaf node */
if (root->left == NULL && root->right == NULL)
if (sum-root->val == 0)
flag = true;
/* not leaf node */
if (root->left != NULL)
dfs(root->left, sum-root->val);
if (root->right != NULL)
dfs(root->right, sum-root->val);
}
};
编辑一下,最近又做了一次这道题,写法有了点改变,这种类型的题一定要学会分类,分的清晰就不容易出错,漏掉corner case,我说下我的方法
分以下几种情况:
1,如果root为null,则此时必然为false。。
2,如果root不为null,但是root的left和right均为null,则此时就是一个leaf node,如果sum等于root->val则为true,否则为false
3,如果是余下的情况,则进行recursive,分别进行haspathsum(left)和haspathsum(right),返回这两个结果的或值
然后上传一下我这次的代码:
/**
* 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:
bool hasPathSum(TreeNode* root, int sum) {
if (root == nullptr) {
return false;
}
if (root->left == nullptr and root->right == nullptr) {
return (sum - root->val == 0);
}
bool l = false;
bool r = false;
if (root->left != nullptr) {
l = hasPathSum(root->left, sum - root->val);
}
if (root->right != nullptr) {
r = hasPathSum(root->right, sum - root->val);
}
return l or r;
}
};