您的位置:首页 > 其它

Leetcode---Path Sum

2015-01-02 12:02 260 查看
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.

Show Tags

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;

}

然后看值传递的方式:耗时80ms,明显慢一些,和传了三个参数关系不大,因为去掉成两个参数之后还是76ms

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: