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.
这题的意思是,给一个值sum,问在这可树里,有没有一条从根到叶子的路径,其权和等于sum。
可想而知,这题用递归的方法会比较容易实现,每次从父节点到叶子节点,都更新一下当前权值,如果到叶子节点的时候,权值等于sum,那么就可完成。
如果采用的方法是,从父节点到子节点,权值+父节点的值,那么代码如下:
class Solution {
public:
int mySum; //保存输入的sum
bool findTrue(TreeNode *root, int sum){
if (root == NULL) return false;
if (root -> val + sum == mySum &&
root -> left == NULL &&
root -> right == NULL) return true;
return findTrue(root -> left, sum + root -> val) ||
findTrue(root -> right, sum + root -> val);
}
bool hasPathSum(TreeNode *root, int sum) {
mySum = sum;
return findTrue(root, 0); //从0开始计数
}
};
这种做法要写两个函数,还要加上一个全局变量,否则sum无法保存。
有没有办法可以只用一个函数就完成呢?我们反过来想,不需要每一次递归都加上自己的值,而是减去,当到达叶子,值为0时,返回true。
这样的话,只需要三行代码。
bool hasPathSum(TreeNode *root, int sum) {
if (root == NULL) return false;
if (root->val == sum && root->left == NULL && root->right == NULL) return true;
return hasPathSum(root->left, sum-root->val) || hasPathSum(root->right, sum-root->val);
}