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