112. 路徑總和(樹遞迴中的一點小收穫_什麼是子節點)
阿新 • • 發佈:2019-02-04
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 sum = 22,
5.
/ \
4. 8
/ / \
11. 13 4
/ \ \
7 2. 1
返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。
從這道題中,我學到了關於“root” 與 “root.left”的判斷!尤其是判斷終結條件和返回值的時候。比如,上一題的輸入是一個root,最後返回的值也是root(因為最後結果得是一個樹),所以,在遞迴的時候如果輸入的是“root.left”,那麼此時返回的也是“root.left”的節點,然後對此進行操作:增刪改查、儲存,都可以!
而這個題呢?和上不同,返回的不是節點,而是boolean。如何根據“root”來判斷當前節點是不是最後返回true的那個節點。假設2是這個節點,成立的條件是:這個root節點的左右孩子為null,並且sum的值為0。
即判斷結束條件的時候,這裡暫時理解為:判斷root的子孩子是不是為null好了。肯定也有判斷root為結束條件的,等以後對比一下。
其實歸根到底吧,是如何判斷一個節點是不是子節點沒有搞清,顯然應該是當前這個節點沒有左右孩子。
當root為null的時候,這時候我們就假設就是真正的樹的根,作為一個null數,是沒有任何值的,所以返回false。
現在,可是知道了,關於root、root.left、root.right是不是為null是一定要考慮的。
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root == null)
return false;
if (root.left == null && root.right == null && sum == root.val)
return true;
boolean hasleft = hasPathSum(root.left,sum-root.val);
boolean hasright = hasPathSum(root.right,sum-root.val);
return hasleft || hasright;
}
}
注意:判斷條件是:sum == root.val
再次我要儲存之前的錯誤版本,以供我之後借鑑:
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(sum == 0)
return true;
if(root == null && sum != 0))
return false;
boolean hasleft = false;
boolean hasright = false;
if(root.left != null)
hasleft = hasPathSum(root.left,sum-root.val);
if(root.right != null)
hasright = hasPathSum(root.right,sum-root.val);
return hasleft || hasright;
}
}