Leetcode--437. 路径总和 III

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过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的难度分布情况了,这道题算得上是简单吗???  难道我拉低了同行的平均水平吗???

猜你喜欢

转载自blog.csdn.net/weixin_41514525/article/details/82990788