LeetCode原题: 剑指 Offer 34
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5, 4, 11, 2],
[5, 8, 4, 5]
]
首先看到这问题, 一般二叉树的问题都能用递归解决. 对此题递归的定义, 没有返回值, 只不过在递归树的过程中, 把路径和为 sum 的路径记录到 结果(res)中.
- 终止条件是什么?
- 当递归到的当前节点为 空 时.
- 怎么样得到路径呢?
- 在递归过程中, 每次到达一个节点的时候, 向arr 数组中 push 节点的 val 来表示我现在正在这个节点这里,那么arr的上一个值表示的就是上一次经过的节点.
- 怎么样知道路径和为sum?
- 用一个 变量 tar 表示目标值, 最开始时什么都没有经过那么tar的值等于 sum. 每次经过节点时减去 现在的 节点值,代表我经过了当前节点,并且也记录了当前的值, 当 tar 为 0 时, 则代表所经过的路径和为sum.
- 怎么样把路径和为sum的 路径值 .记录到结果中?
- 上面也说到了, 当 tar 为 0 时, 代表和为sum, 那么就在此时 把记录路径的 res数组, push 到 res 中
var pathSum = function(root, sum) {
let res = [] // 用来保存结果
let arr = [] // 保存经过的路径
dfs(root, sum) // 调用递归, 最开始没有经过节点, 目标值 tar 等于 sum
return res
function dfs(root, tar) {
if(!root) return // 终止条件
arr.push(root.val) // 保存经过节点
tar -= root.val // 得到目标值,
if(tar === 0 && !root.left && !root.right) // 如果目标值为0, 并且为叶子节点
res.push([...arr]) // 向结果中 插入 路径数组, 必须得重新赋值一个数组!
dfs(root.left, tar) // 递归左子树, 此时参数 tar 是已经减去当前节点值了
dfs(root.right, tar) //递归右子树
arr.pop() // 当前的这层递归结束了,就应该把当前的路径从arr中去掉
}
};
面试题:
Object.create 怎么实现的?