給定乙個二叉樹,它的每個結點都存放著乙個整數值。
找出路徑和等於給定數值的路徑總數。
路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。
這題採用雙遞迴的方式,但是依舊是按照遞迴的模板來(1.找到最簡單的子問題求解,2.其他問題不考慮內在細節,只考慮整體邏輯)。
題目要求 路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點) 。這就要求我們只需要去求三部分即可:
將這三部分之和作為最後結果即可。
但是注意我們要新寫乙個輔助方法,用來求上面三種情況的路徑,並且在這個輔助函式裡面還要遞迴呼叫。
即:假如現在傳了乙個root給輔助函式,因為「不需要在葉子節點結束」,所以每隔乙個節點都要判斷一次這乙個節點的值滿不滿足要求,也就是sum-root.val是否為0.如果是結果路徑+1,然後 「不管上一步的路徑是否加1」我們都要去找root的左子樹 ,右子樹,即「找到乙個節點要做的事,剩下的交給遞迴框架」
class
solution
int result =
countpath
(root,sum)
;int a =
pathsum
(root.left,sum)
;int b =
pathsum
(root.right,sum)
;return result+a+b;
}public
intcountpath
(treenode root,
int sum)
sum = sum - root.val;
//用sum減去root.val看是不是0;
int result = sum ==0?
1:0;
//如果是0,證明滿足條件,路徑為1
int leftcount=
countpath
(root.left,sum)
;int rightcount=
countpath
(root.right,sum)
;return result + leftcount + rightcount;
}}
437 路徑總和 III
給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...
437 路徑總和 III
給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...
437 路徑總和 III
和112 113題類似 不過這一題更難一些,需要進行雙重遞迴 即對每個節點做遞迴,再以該節點為起點進行dfs,搜尋滿足條件的路徑 class solution object def init self self.count 0 def pathsum self,root,sum if not roo...