给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 返回 3。和等于 8 的路径有: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我做这道题的时候,利用了路径总和ll的思路。 其实这道题和 ll 差别在于这次的端节点不限制,这一点比较不好转化,其实当它的起点不要求时,那么就可遍历所有的节点,每一次都看从它开始往下有没有可以满足的路(这里就和路径总和ll 的思路基本相同了)。如果有,用一个变量记录。
这次我写的代码效率不高,超过了50%多的提交。。。。。。。。。。。。用的递归套递归,能AC我都。。。。
AC:
class Solution {
public:
void fun(TreeNode* root,int sum,vector<int> &t,int & cnt)
{
if (root==NULL)
return ;
t.push_back(root->val);
if (sum==root->val)
{
cnt++;
}
fun(root->left,sum-root->val,t,cnt);
fun(root->right,sum-root->val,t,cnt);
t.pop_back();
}
void funn(TreeNode* root,int sum,vector<int> &t,int & cnt)
{
if (root==NULL)
{
return ;
}
fun(root,sum,t,cnt);
t.clear(); //每次换一次头节点时,那个容器t清空一次,实测其实不清空也可以,但感觉清空了舒服一点。
funn(root->left,sum,t,cnt);
funn(root->right,sum,t,cnt);
}
int pathSum(TreeNode* root, int sum) {
if (root==NULL)
return 0;
int cnt=0;
vector<int> t;
funn(root,sum,t,cnt);
return cnt;
}
};
开始怀疑leetcode的难度分布情况了,这道题算得上是简单吗??? 难道我拉低了同行的平均水平吗???