剑指Offer 34 - 二叉树中和为某一值的路径

题目描述

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

思路

(当前节点记为root,剩下的和记为remain,当前记录的路径记为cur,最终结果res)

递归:二叉树中节点值的和为sum的路径,即子树中节点值的和为sum-root.val的路径。

递归退出条件:走到叶子结点,且减掉节点值后remain为0。

递推工作:remain -= root.val, 将root.val加入cur路径。递推左节点,再递推右节点,从cur中删去当前节点,返回上一层递归。

代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {number[][]}
 */
var pathSum = function(root, sum) {
    let res = [];
    let cur = [];
    
    recursion(root, sum, cur, res);
    return res;
};

function recursion(root, remain, cur, res){
    if(!root)   return;
    
    cur.push(root.val);
    remain -= root.val;
    
    if(remain === 0 && !root.left && !root.right){
        res.push(Array.of(...cur));
    }
    recursion(root.left, remain, cur, res);
    recursion(root.right, remain, cur, res);
    
    cur.pop();
    
}

易错:

  1. 退出条件不可以写为:走过叶子结点且sum为0,root==null && sum===0。 这样每条路径都会被添加两次(终点的左右儿子都是null,都会添加一次)
  2. 将路径添加进结果数组时不可以直接res.push(cur),这样cur仍然只是数组的一个引用,会继续改变。必须res.push(Array.of(...cur))新建一个数组。
  3. 不需要在remain<0时提前退出递归,因为树中可能有负数。

猜你喜欢

转载自www.cnblogs.com/xintangchn/p/13190615.html
今日推荐