leetcode路徑總和問題總結DFS

2021-10-07 05:36:10 字數 1235 閱讀 8937

leetcode 112

一般來說關於dfs有兩個套路:

第乙個就是用recursion來完成,這種在理解上著實也不是很簡單,但是一旦理解了,起飛!

第二個的話就是用stack來完成iteration,會比上面好理解,但是複雜度會稍微差一點。

思路:此題就是乙個明顯的recursion的問題,我們要從root開始,逐步的先往左枝走,如果不滿足再倒退回上乙個節點,再往右枝走。

如果我們遍歷的node不是leaf,那麼我們就獲取val,進而獲取我們接下來需要滿足的條件:sum-val.

最後每乙個node都會進行左右node的兩個recursion call。

每一步我們都會進行判斷是不是leaf和到沒到sum的要求,如果到了,就返回true;反之,false。

關於為什麼去並集,因為只要有乙個path存在,我們的任務就完成了,所以只要有true,最後就是true。

class solution 

if(root.val == sum && root.left == null && root.right == null)

return haspathsum(root.left, sum - root.val) || haspathsum(root.right, sum - root.val);

}}

leetcode 113

相比於leetcode112,這個題是找滿足條件的所有path,即並不是找到就停,而是要遍歷所有的path。

思路:要建立list組成的list來存最終的result,要建立list去存當前的這個路徑。

接下來思路與之前近乎相同,採用recursion的方法,先遍歷左側,如果沒有滿足條件且是leaf,則倒退乙個node,繼續右枝(如果有的話)。

將每乙個遍歷到的node放入curpath,然後改變條件至sum-node.val。

如果滿足條件,則存下當前的乙個list,也就是curpath;如果不滿足條件,則將sum改為sum-node.val繼續進行recursion。

最重要的一點,當我們到達了某乙個leaf的時候,我們發現當前path並不滿足和為sum的時候,我們在倒退會上乙個node的同時,要在curpath中清除當前節點!!!!

class solution 

void recur(treenode root,int sum)

track.remove(track.size()-1);

}}

LeetCode 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 如下 definition for a binary tree nod...

LeetCode 路徑總和

給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...

leetcode 路徑總和II(python)

題目 給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 思想 二叉樹深度遍歷 回溯 class so...