Path Sum
一个二叉树,是否存在从根节点到叶子节点的路径,其节点的值的和为指定整数,如果有,打印出所有数组。
需如下树节点求和
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的更多相关文章
- 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 ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [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. ...
- [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 ...
- [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 ...
- 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 ...
- [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 ...
- [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 ...
随机推荐
- android 控件在不同状态下的内容样式与背景样式
1 控件内容(如字体颜色)在不同状态下有不同的表现色ref:http://developer.android.com/guide/topics/resources/color-list-resourc ...
- [django]表格的添加与删除实例(可以借鉴参考)
自己并未采用任何表格插件,参考网上例子,自己编写出来的django网页实例,请各位参考! 首先看图做事,表格布局采用bootstrap,俗话说bootstrap橹多了就会css了,呵呵,下面看图: 上 ...
- linux学习(2)
自从安装了虚拟机和各种工具软件之后,学习Linux的过程不断被打断,一直想把Ubuntu烧录到itop4412开发板里面去,却总是失败,感觉这个过程都加强我的抗打击能力了,现在来说说,对于一个第一次烧 ...
- 【2016-11-7】【坚持学习】【Day22】【Oracle 分页查询】
方法1: select * from (select rownum rn, temp.* from ( +sqlText+ ) temp ) where rn > "+ start + ...
- 洛谷P3407 散步[分组]
题目描述 一条道路上,位置点用整数A表示. 当A=0时,有一个王宫.当A>0,就是离王宫的东边有A米,当A<0,就是离王宫的西边有A米. 道路上,有N个住宅从西向东用1-N来标号.每个住宅 ...
- 第4章 文本编辑器vim
1. vim常用操作 1.1 vim简介 (1)vim是一个功能强大的全屏幕文本编辑器,是Linux/Unix上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件. (2)vim没有菜单,只有命令 ...
- webpack中alias别名配置
resolve:{ alias:{ bootcss:__dirname + '/node_modules/.3.3.7@bootstrap/dist/css/bootstrap.min.css' } ...
- perl 调用shell脚本
perl调用shell命令 perl调用shell shell调用perl Perl执行shell命令的几种方式及其区别
- linux-windows资源共享
先安装samba,然后 sudo mount -t cifs //192.168.1.111/Jack_Win_Share /media/ -o username=Jack,password=1,io ...
- ActiveX控件之ActiveXObject is not defined
ActiveX控件方便用户在网页中插入各种效果,但是并不是所有浏览器都支持该控件. ActiveX是微软独有的,只有基于IE内核的浏览器才能使用. 当出现如上错误,可以将通过该控件创建的对象定义为本地 ...