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,
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);
}
引申一下,如果要求树的所有路径和呢?
若把NULL也当做叶子节点呢?
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); } }
相关文章推荐
- leetcode-64. Minimum Path Sum
- Leetcode 64. Minimum Path Sum
- LeetCode 64. Minimum Path Sum 二维路线最短路径
- Leetcode Path Sum
- 【LeetCode】Path Sum ---------LeetCode java 小结
- <LeetCode OJ> 64. Minimum Path Sum
- [LeetCode] Path Sum
- LeetCode题解:Path Sum
- [LeetCode] Path Sum
- [Leetcode] 112. Path Sum
- LeetCode 63. Minimum Path Sum
- LeetCode 之 Path Sum
- LeetCode题解:Path Sum
- 【LEETCODE】112-Path Sum
- LeetCode112 Path Sum
- 【LeetCode】Path Sum
- 【Leetcode】112. Path Sum
- [LeetCode] 64. Minimum Path Sum
- leetcode: 64. Minimum Path Sum
- LeetCode112 Path Sum