Time:2019/4/26
Title: Path Sum
Difficulty: Easy
Author: 小鹿javascript
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.java
Note: A leaf is a node with no children.node
給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上全部節點值相加等於目標和。說明: 葉子節點是指沒有子節點的節點。git
示例:
給定以下二叉樹,以及目標和sum = 22
,github
Example:算法
Given the below binary tree and sum = 22
,編程
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2
which sum is 22.code
1)搜索從根節點到葉子節點可以達到目標值,毋庸置疑,一看到檢索二叉搜索樹,就應該想起遞歸。2)第一個想法就是一個個進行相加,將每條路徑相加完成以後,判斷是否達到當前目標值?遞歸
3)可是 (2)的解決方案的想法要用到遞歸上,須要轉變一下思路,畢竟咱們要用遞歸的編程技巧來解決,因此思惟須要稍微轉變一下(將問題化成子問題,子問題與總問題有相同的解決思路)。ip
1)既然要用到遞歸來解決,這樣來想,每遍歷一個結點,咱們就用 sum 減去當前結點,而後問題就會變成從當前結點到葉子節點可以知足 sum 減去當前結點的值,那麼就存在知足條件的路徑。2)在(1)中,將問題化成子問題,而後子問題和問題有相同的解決思路,那麼就可使用遞歸來解決。
3)用 flag 作標識,一旦知足路徑之和等於目標值,就讓改變 flag 的狀態。
var hasPathSum = function(root, sum) { let flag = false; // 判斷當前二叉樹是否等於 null if(root == null) return false; dfs = (root,sum)=>{ // 若是當前結點爲 null ,返回 false if(root == null) return false; // 判斷左右子樹是否爲 null if(root.left == null && root.right == null){ // 若是不爲 null,就判斷當前的值和最後一個結點值是否相同 if(sum == root.val){ flag = true; return; } } // 遞歸搜索全部路徑 dfs(root.left,sum - root.val) dfs(root.right,sum - root.val) } dfs(root,sum) return flag; };