摘要:先走一步啦力扣路徑總和,對(duì)解題代碼的深入思考思考的問(wèn)題記一次對(duì)該解題代碼的位置擺放和的深入思考。舉個(gè)例子可以看到當(dāng)進(jìn)入右子樹(shù)時(shí),此時(shí)為,就返回了,顯然并不是正確的答案。
// carl哥的回溯解題法,// 略微有些改動(dòng),其實(shí)就是把 // return traversal(root, targetSum-root.val);// 的targetSum-root.val,放在了外面,對(duì)我來(lái)說(shuō)這更清晰些class Solution { public boolean hasPathSum(TreeNode root, int targetSum) { if(root==null){ return false; } // 先走一步啦 targetSum-=root.val; return traversal(root, targetSum); } private boolean traversal(TreeNode root, int count){ if(root.left==null && root.right==null && count==0){ // 當(dāng)為葉子節(jié)點(diǎn)時(shí),如果count為0就返回true return true; } if(root.left!=null){ count-=root.left.val; if(traversal(root.left, count)){ return true; } count+=root.left.val; } if(root.right!=null){ count-=root.right.val; if(traversal(root.right, count)){ // 如果子樹(shù)找到了,那就直接返回true return true; } count+=root.right.val; } return false; }}
終止條件是root位于葉子結(jié)點(diǎn)才終止(這里先不討論count)
如果root為null作為終止條件,是會(huì)判錯(cuò)的。
舉個(gè)例子
1 targetsum=1
2
可以看到當(dāng)進(jìn)入右子樹(shù)時(shí),
此時(shí)為null,就返回true了,顯然并不是正確的答案。
我們?cè)賮?lái)討論count
count 也是我們判斷是否是正確路徑的條件之一
? 如果count為0時(shí)正確,那么需要提前減去當(dāng)前節(jié)點(diǎn)值,
? 也就是進(jìn)入循環(huán)之前減去root值。
? 舉個(gè)例子
? 1 targetsum=1 只有一個(gè)根節(jié)點(diǎn)的樹(shù)
? / /
? [1]就是一條路徑,如果我們不先減去root的值,
? 那么進(jìn)入回溯的if判斷就不會(huì)成功返回true
? 有同學(xué)可能會(huì)想我把減去當(dāng)前root值的條件放在這里怎么樣
當(dāng)然是可以的,只不過(guò)我們需要對(duì)整道題作些調(diào)整。
class Solution { public boolean hasPathSum(TreeNode root, int targetSum) { if(root==null){ return false; } count=targetSum; return traversal(root); } int count; private boolean traversal(TreeNode root){ count-=root.val; if(root.left==null && root.right==null && count==0){ // 當(dāng)為葉子節(jié)點(diǎn)時(shí),如果count為0就返回true return true; } if(root.left!=null){ if(traversal(root.left)){ return true; } count+=root.left.val; } if(root.right!=null){ if(traversal(root.right)){ // 如果子樹(shù)找到了,那就直接返回true return true; } count+=root.right.val; } return false; }}
? 我們首先選擇把位于這里的代碼刪去,如果不刪去的話進(jìn)入下一層循環(huán)就相當(dāng)于減去了兩次root.left.val
? 然后我們要把count變成全局變量,因?yàn)槲挥诤瘮?shù)參數(shù)的count是一個(gè)局部變量,它在下一層函數(shù)中減去了root.left.val
,count+=root.left.val
的目的就是為了把它加回來(lái)。然而如果他是局部變量,我們就加在了本層函數(shù)的局部變量count里,而不是下層函數(shù)的count。
?
? 那么把count+=root.left.val
,變成count+=root.val
行不行呢,當(dāng)然是不行的,因?yàn)檫@層函數(shù)減去的root.val
是上一層函數(shù)的root.left.val
。
? 根節(jié)點(diǎn)剛進(jìn)來(lái)時(shí)屬于一種特殊情況。
? 如果count為root.val
時(shí)正確
class Solution { public boolean hasPathSum(TreeNode root, int targetSum) { if(root==null){ return false; } return traversal(root, targetSum); } private boolean traversal(TreeNode root, int count){ if(root.left==null && root.right==null && count==root.val){ // 當(dāng)為葉子節(jié)點(diǎn)時(shí),如果count為root.val就返回true return true; } if(root.left!=null){ count-=root.val; if(traversal(root.left, count)){ return true; } count+=root.val; } if(root.right!=null){ count-=root.val; if(traversal(root.right, count)){ // 如果子樹(shù)找到了,那就直接返回true return true; } count+=root.val; } return false; }}
總結(jié):使用遞歸解題,代碼的擺放位置和終止條件的選擇都對(duì)編碼方式有著巨大的影響
? 個(gè)人感悟:對(duì)一顆樹(shù)的完整思考是,從根節(jié)點(diǎn)出發(fā),到左子樹(shù),進(jìn)入下一層循環(huán),看一眼終止條件,就可以回到上一層循環(huán),不用在繼續(xù)往下走了,就可以驗(yàn)證解題代碼是否正確的
get到的點(diǎn)
]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123603.html
摘要:月下半旬攻略道題,目前已攻略題。目前簡(jiǎn)單難度攻略已經(jīng)到題,所以后面會(huì)調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時(shí),攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚(yú)有什么區(qū)別...
閱讀 644·2021-11-22 15:32
閱讀 2731·2021-11-19 09:40
閱讀 2323·2021-11-17 09:33
閱讀 1281·2021-11-15 11:36
閱讀 1880·2021-10-11 10:59
閱讀 1490·2019-08-29 16:41
閱讀 1793·2019-08-29 13:45
閱讀 2166·2019-08-26 13:36