一个二叉树,是否存在从根节点到叶子节点的路径,其节点的值的和为指定整数,如果有,打印出所有数组。

需如下树节点求和

    5
     /  \
   4     8
    /     /  \
  11  13    4
  / \       /  \
  7    2      5   1

JavaScript实现

window.onload = function() {
var n1 = new TreeNode(1, null, null),
n51 = new TreeNode(5, null, null),
n2 = new TreeNode(2, null, null),
n7 = new TreeNode(7, null, null),
n42 = new TreeNode(4, n51, n1),
n13 = new TreeNode(13, null, null),
n11 = new TreeNode(11, n7, n2),
n8 = new TreeNode(8, n13, n42),
n4 = new TreeNode(4, n11, null),
n5 = new TreeNode(5, n4, n8); var sum = 22; var res = getPathSum(n5, sum);
console.log('res: ', res); var has = hasPathSum(n5,22);
console.log('has: ', has); var count = pathCount(n5,22);
console.log('count: ', count);
} function TreeNode(val, left, right) {
this.val = val;
this.left = left;
this.right = right;
} //path sum i(https://leetcode-cn.com/problems/path-sum-i/)
function hasPathSum(root, sum) {
if (root == null) return false; sum -= root.val; if (sum == 0 && root.left == null && root.right == null) return true; return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);
} //path sum ii(https://leetcode-cn.com/problems/path-sum-ii/)
function getPathSum(root, sum) {
var res = [],path = [];
dfs(root, sum, path, res);
return res;
} function dfs(root,sum,path,res){
if(root == null) return; sum -= root.val;
path.push(root.val); if(sum == 0 && root.left == null && root.right == null){
res.push(copy(path));
//这句可以加,也可以不加, 加上,可以减少后面的两个dfs内部的null判断,因为此时root的left和right都为null
return path.pop();
} dfs(root.left,sum,path,res);
dfs(root.right,sum,path,res); path.pop();
} function copy(a){
return JSON.parse(JSON.stringify(a))
} //path sum iii(https://leetcode-cn.com/problems/path-sum-iii/)
function pathCount(root,sum){
return helper(root,sum,[],0);
} //思路就是,深度优先遍历所有节点,用path记录从根节点到该节点的路径
//由于只计算从上到下的节点和,所以从当前节点沿着path向上求和
//到合适的节点就计数,直至到根节点,当前节点为终点的所有路径计数完毕
function helper(root,sum,path,p){
if(root == null) return 0;
//记录当前节点的值
path[p] = root.val;
//path此时记录的是根节点到当前节点的路径上的所有节点
let temp = 0, n=0;
//p是当前节点的位置,从当前节点开始向根节点一路做加法
for(let i=p;i>=0;i--){
temp += path[i];
//当前节点加到某节点符合,就计数,由于节点值可能为0或负值,此处不能break,还需继续计算
if(temp == sum) n++;
}
//path虽然是引用传递,但是left和right用的是同一个索引p+1,所以path中的值会被覆盖
//path中的值始终是到当前节点的路径值,不需要拷贝数组,也不需要弹出已经访问的值
let left = helper(root.left,sum,path,p+1);
let right = helper(root.right,sum,path,p+1); return n + left + right;
}

Path Sum的更多相关文章

  1. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  2. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  3. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  4. [LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  5. [LeetCode] Path Sum II 二叉树路径之和之二

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  6. [LeetCode] Path Sum 二叉树的路径和

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  7. Path Sum II

    Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...

  8. [leetcode]Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  9. [leetcode]Path Sum II

    Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...

随机推荐

  1. 烂泥:haproxy与nginx、zabbix集成

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 昨天介绍了haproxy的手机匹配规则,今天再来介绍下haproxy与nginx.za ...

  2. class.c 添加中文注释(2)

    /* Class Device Stuff */ int class_device_create_file(struct class_device * class_dev, const struct ...

  3. 关于ScheduledExecutorService执行一段时间之后就不执行的问题

    在项目中使用java的定时任务时,有的时候执行一段时间后没任何反应了.这里有篇文章说了这个问题.猛击下面的链接. http://blog.163.com/scuqifuguang@126/blog/s ...

  4. 谈谈Redis的SETNX

    谈谈Redis的SETNX 发表于2015-09-14 在 Redis 里,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果,不 ...

  5. Windows7台式电脑怎么调节屏幕亮度

     

  6. [NOIP2014]自测

    这两天做完了2014年的noip提高. 因为以前看了SDSC2016时gty的课件,题目思路都知道了一点,做起来没多大困难. 100+100+75+100+100+70=545 里面水分好多,好多题都 ...

  7. C/C++编程语言学习资料尽收眼底 电子书+视频教程

    Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...

  8. Swift语言学习

    因为想要学Mac os x编程,中文教材太少了,看了很多厉害的英文教材,很多都是swift语言的了,所以决定先要大体学一下swift语言. 学习一门语言,第一件事看swift官方文档,这里附上Coco ...

  9. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  10. SqlMetal.exe ORM代码生成

    作甚? 先说说这个工具是干啥的,我们所做的程序,或多或少需要存储一些数据到数据库,当然直接使用Sql语句也可以,甚至有些情况下就是要使用sql语句,但对于一些基本的增删改查,对每张表都要写查询语句就显 ...