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; };