首页 > 解决方案 > 为什么根变量最终会保留在 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);

标签: javascriptalgorithmtree

解决方案


root变量仅引用根对象。这在扩展过程中不会改变。但在此过程中,该对象的leftright属性更改值(null从新节点)。

在循环的第一次迭代中,currgets 引用与 相同的对象root,因此无论发生什么突变都会被curr带到root:两个变量都可以访问一个对象。由于代码设置curr.left为新节点并设置curr.right为新节点,此时root.leftroot.right已设置为新节点。

在下一次迭代中,curr将引用那些新创建的节点之一(它们已经“附加”到root),同样的情况发生在那里:正如currmutated 一样,我们实际上改变了一个可以从 到达的节点rootleft更深的节点通过其和/或right属性引用的新节点得到扩展。


推荐阅读