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
說明: 葉子節點是指沒有子節點的節點。github
示例: 給定以下二叉樹,以及目標和
sum = 22
,算法
Example:編程
Given the below binary tree and sum = 22
,bash
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.spa
1)搜索從根節點到葉子節點可以達到目標值,毋庸置疑,一看到檢索二叉搜索樹,就應該想起遞歸。code
2)第一個想法就是一個個進行相加,將每條路徑相加完成以後,判斷是否達到當前目標值?
3)可是 (2)的解決方案的想法要用到遞歸上,須要轉變一下思路,畢竟咱們要用遞歸的編程技巧來解決,因此思惟須要稍微轉變一下(將問題化成子問題,子問題與總問題有相同的解決思路)。
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;
};
複製代碼
歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫! Github:https://github.com/luxiangqiang/JS-LeetCode 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。