437 路徑總和 III 遞迴

2021-10-12 17:50:06 字數 1309 閱讀 9608

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過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...