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.
Have you met this question in a real interview?
这个题关键在于如何在递归中计算遍历的节点的和,一个技巧就是入口处加,出口处减,当然还有的诀窍是传值传递参数
首先看用全局变量或者引用传递的方法,用时20ms
- int num=0;
- bool hasPathSum(TreeNode *root, int sum){
- if(root==NULL)
- return false;
- num+=root->val;
- if(root->left==NULL && root->right==NULL){
- if(num==sum){
- num-=root->val;
- return true;
- }
- else{
- num-=root->val;
- return false;
- }
- }
- bool result= hasPathSum(root->left,sum)||hasPathSum(root->right,sum);
- num-=root->val;
- return result;
- }
- bool f(TreeNode *root, int& sum, int num){
- if(root==NULL)
- return false;
- num+=root->val;
- if(root->left==NULL && root->right==NULL){
- if(num==sum){
- return true;
- }
- else{
- return false;
- }
- }
- return f(root->left,sum,num)||f(root->right,sum,num);
- }
- bool hasPathSum(TreeNode *root, int sum){
- return f(root,sum,0);
- }
引申一下,如果要求树的所有路径和呢?
void help(TreeNode *root, int& num){
if(root==NULL){
}
else if(root->left==NULL && root->right==NULL){
num+=root->val;
cout<<num<<endl;
num-=root->val;
}
else{
num+=root->val;
help(root->left,num);
help(root->right,num);
num-=root->val;
}
}
如果是值传递呢?return的时候值传递的参数会被销毁,所以可以不用减去上次加的值。
void help(TreeNode *root, int num){
if(root==NULL){
}
else if(root->left==NULL && root->right==NULL){
num+=root->val;
cout<<num<<endl;
}
else{
num+=root->val;
help(root->left,num);
help(root->right,num);
}
}
若把NULL也当做叶子节点呢?
void help(TreeNode *root, int num){
if(root==NULL){
cout<<num<<endl;
}
else{
num+=root->val;
help(root->left,num);
help(root->right,num);
}
}