1. 程式人生 > >Leetcode--437. 路徑總和 III

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的難度分佈情況了,這道題算得上是簡單嗎???  難道我拉低了同行的平均水平嗎???