二叉树中何为某一值的路径(js版)

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 怎么实现的?

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页