1. 程式人生 > >112. 路徑總和(樹遞迴中的一點小收穫_什麼是子節點)

112. 路徑總和(樹遞迴中的一點小收穫_什麼是子節點)

給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。

示例: 
給定如下二叉樹,以及目標和 sum = 225.
             /  \
            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;
    }
}