javascript - 为什么根变量最终会保留在 while 循环中生成的整个树的结果?
问题描述
curr 变量在 while 循环的第一次迭代中引用了 root,但是从第二次迭代开始,curr 变量应该在每次迭代时都引用一个新创建的节点?
var TreeNode = function (value, left, right) {
this.value = value;
this.left = left;
this.right = right;
};
function arrayToTree(array) {
if (!array.length) return undefined;
var root = new TreeNode(array.shift());
var queue = [root];
while (array.length) {
var curr = queue.shift();
var left = new TreeNode(array.shift());
curr.left = left;
queue.push(left);
if (!array.length) break;
var right = new TreeNode(array.shift());
queue.push(right);
curr.right = right;
}
return root;
};
const ret = arrayToTree([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
console.log(ret);
解决方案
该root
变量仅引用根对象。这在扩展过程中不会改变。但在此过程中,该对象的left
和right
属性更改值(null
从新节点)。
在循环的第一次迭代中,curr
gets 引用与 相同的对象root
,因此无论发生什么突变都会被curr
带到root
:两个变量都可以访问同一个对象。由于代码设置curr.left
为新节点并设置curr.right
为新节点,此时root.left
并root.right
已设置为新节点。
在下一次迭代中,curr
将引用那些新创建的节点之一(它们已经“附加”到root
),同样的情况发生在那里:正如curr
mutated 一样,我们实际上改变了一个可以从 到达的节点root
。left
更深的节点通过其和/或right
属性引用的新节点得到扩展。
推荐阅读
- python - setuptools 不安装设置要求
- javascript - 在 socket.io 上添加事件侦听器以节省资源的最佳方法
- r - 根据模式提取R中的元素
- python - 在 python 中切片列表时迭代地跳过 n 个元素
- arrays - jq - 为数组的值添加前缀
- amazon-web-services - Google Domain 和 AWS S3 静态页面
- flutter - 运行flutter app时“任务':app:mergeDebugJavaResource'的执行失败。”的可能解决方案是什么
- javascript - Woocommerce:如何在标题上显示产品属性名称和类别名称
- performance - 按组matlab计算观察次数
- python - 有没有办法修改传递给 seaborn 中 facetgrid 的数据框?