LeetCode 112 路徑總和(path-sum)

1.題目

  • 難度:簡單javascript

  • 涉及知識:樹、廣度優先搜索java

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

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

  • 示例:優化

給定以下二叉樹,以及目標和 sum = 22,this

5
         / \
        4   8
       /   / \
      11  13  4
     /  \      \
    7    2      1
複製代碼

返回 true, 由於存在目標和爲 22 的根節點到葉子節點的路徑 5->4->11->2。spa

2.解題:

/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */
/** * @param {TreeNode} root * @param {number} sum * @return {boolean} */
var hasPathSum = function(root, sum) {
    if(!root){
        return false;
    }
    sum = sum - root.val;
    if(!root.left && !root.right){
        return sum === 0;
    }
    //若是還有子節點,則繼續遞歸遍歷該節點的孩子
    return hasPathSum(root.left,sum) || hasPathSum(root.right,sum);
};
複製代碼
  • LeetCode Submit
執行用時 :92 ms, 在全部 JavaScript 提交中擊敗了89.42%的用戶
內存消耗 :37.1 MB, 在全部 JavaScript 提交中擊敗了51.15%的用戶
複製代碼

3.解析

  • 遞歸方式

同前面二叉樹遍歷方式,整體採用遞歸方式進行。code

  • 正向思路 和 反向思路

kk一開始的思路是採用正面的思路,即輸入固定的sum值22,遍歷每條路徑取得總和,與sum進行比對,後來發現這樣的作法性能並不高
改用反向思路,即從sum開始處理,每遍歷一項,就從sum當中減去相應的該節點的值,若是減到最後(沒有left,right節點)的狀況,sum若爲0即視爲該二叉樹存在該路徑總和。遞歸

有方法優化請各位多多指教!ip

相關文章
相關標籤/搜索