You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript递归打印二叉树:二维数组所有行被错误修改的问题求解

问题分析与解决方案

你的问题根源在于数组初始化时的引用共享,这是JavaScript里很容易踩的坑!

为什么所有子数组都会被修改?

看你初始化output的这行代码:

let output = new Array(depth).fill(new Array(width).fill(''));

fill方法在这里做了一件“偷懒”的事:它把new Array(width).fill('')这个数组的引用重复填充到了output的每个索引位置。也就是说,output[0]、output[1]……所有子数组其实都是同一个数组对象的别名。不管你修改哪一层的哪个位置,本质上都是在修改同一个底层数组,所以最后所有层都会变成一样的内容。

怎么修复?

你需要确保output里的每个子数组都是独立的新数组,而不是共享引用。可以用以下两种方式替换初始化代码:

方式1:使用Array.from

let output = Array.from({ length: depth }, () => new Array(width).fill(''));

Array.from的第二个参数是映射函数,每次迭代都会调用它创建一个新的子数组,完美避免引用共享。

方式2:手动循环创建

如果你更习惯循环写法,也可以这样:

let output = [];
for (let i = 0; i < depth; i++) {
    output.push(new Array(width).fill(''));
}

每次循环都创建一个新的子数组并push进去,每个子数组都是独立的。

修复后的测试效果

当你用上述方式初始化output后,再运行你的测试用例(根节点1,左子节点2),就能得到预期的输出:

[ ['', '1', ''], ['2', '', ''] ]

另外提个小建议:你递归里的水平位置计算在更深的树里可能会有偏差(比如深度3时,左右子节点的偏移量应该是Math.pow(2, depth - level - 2)而不是固定±1),不过这是另一个问题了,当前的核心问题已经解决。

内容的提问来源于stack exchange,提问作者kpozzi90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:04:58