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...