難度:簡單javascript
涉及知識:樹、廣度優先搜索java
題目:給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上全部節點值相加等於目標和。
node
說明:葉子節點是指沒有子節點的節點。性能
示例:優化
給定以下二叉樹,以及目標和 sum = 22,this
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
複製代碼
返回 true, 由於存在目標和爲 22 的根節點到葉子節點的路徑 5->4->11->2。spa
/** * 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);
};
複製代碼
執行用時 :92 ms, 在全部 JavaScript 提交中擊敗了89.42%的用戶
內存消耗 :37.1 MB, 在全部 JavaScript 提交中擊敗了51.15%的用戶
複製代碼
同前面二叉樹遍歷方式,整體採用遞歸方式進行。code
kk一開始的思路是採用正面的思路,即輸入固定的sum值22,遍歷每條路徑取得總和,與sum進行比對,後來發現這樣的作法性能並不高
改用反向思路,即從sum開始處理,每遍歷一項,就從sum當中減去相應的該節點的值,若是減到最後(沒有left,right節點)的狀況,sum若爲0即視爲該二叉樹存在該路徑總和。遞歸
有方法優化請各位多多指教!ip