La variable curr tiene una referencia a la raíz en la primera iteración del ciclo while, pero a partir de la segunda iteración, la variable curr debería tener una referencia a un nodo recién creado en cada iteración.
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);La variable root solo hace referencia al objeto raíz. Eso no cambia durante el proceso de extensión. Pero durante ese proceso, las propiedades left y right de ese objeto cambian de valor (de null a un nuevo nodo).
En la primera iteración del bucle, curr hace referencia al mismo objeto que root , por lo que cualquier mutación que se lleve a curr se lleva a root : ambas variables dan acceso al mismo objeto único. Como el código establece curr.left en un nuevo nodo y establece curr.right en un nuevo nodo, en ese momento root.left y root.right se han establecido en nuevos nodos.
En la próxima iteración, curr hará referencia a uno de esos nodos recién creados (que ya están "conectados" a root ), y lo mismo sucede allí: como curr muta, en realidad mutamos un nodo al que se puede acceder desde root . Ese nodo más profundo se amplía con nuevos nodos referenciados por sus propiedades left y/o right .
Creo que Trincot respondió a tu pregunta. Si eso no está claro, por favor comente.
Pero si desea una versión de esto que no implique mutación, puede hacerlo recursivamente, observando que el hijo izquierdo del nodo formado a partir del valor en el índice i es el formado a partir del valor en el índice 2 * i + 1 y el hijo derecho del valor en el índice 2 * i + 2 , suponiendo que existan:
const toTree = (xs, i = 0) => i >= xs .length ? undefined : {value: xs [i], left: toTree (xs, 2 * i + 1), right: toTree (xs, 2 * i + 2)} console .log (toTree ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) .as-console-wrapper {max-height: 100% !important; top: 0}Esto no usa su constructor TreeNode. A menos que haya más de lo que se muestra, no veo razón para ello. Pero si necesitamos usarlo, podríamos reemplazar esto:
: {value: xs [i], left: toTree (xs, 2 * i + 1), right: toTree (xs, 2 * i + 2)}con este:
: new TreeNode (xs [i], toTree (xs, 2 * i + 1), toTree (xs, 2 * i + 2))