剑指offer | 二叉树中和为某值的路径 值/引用变量 【JavaScript】

题目描述

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

错误代码

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function dfs(root, sum, path, res){    
    sum -= root.val;
    path.push(root.val);
    if(sum === 0 && root.left == null && root.right == null){
        res.push(path); // !error: 这儿错了
    }
    
    if(root.left) dfs(root.left, sum, path, res);
    if (root.right) dfs(root.right, sum, path, res);
    path.pop(); //回溯
}
function FindPath(root, expectNumber)
{
    var path = [];
    var res = [];
    if (!root) return res;
    
    dfs(root, expectNumber, path, res);
    return res;
}

其实就是一个典型的赋值错误。将引用变量path直接push给res,导致最后输出时,res存储的实际上是若干个path的内存地址;而又由于path每次遍历都会回溯(path.pop()),最终是一个空数组,结果res就会返回一个存有若干个空数组的空数组。

正确代码

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function dfs(root, sum, path, res){    
    sum -= root.val;
    path.push(root.val);
    if(sum === 0 && root.left == null && root.right == null){
        let p = path.concat(); //深拷贝
        res.push(p);
    }
    
    if(root.left) dfs(root.left, sum, path, res);
    if (root.right) dfs(root.right, sum, path, res);
    path.pop(); //回溯
}
function FindPath(root, expectNumber){
    let path = [];
    let res = [];
    if (!root) return res;
    
    dfs(root, expectNumber, path, res);
    return res;
}

参考

如何理解JavaScript中给变量赋值,是引用还是复制
JavaScript 是传值调用还是传引用调用?

posted @ 2020-09-27 16:56  Ueeei  阅读(85)  评论(0编辑  收藏  举报