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);
uj5u.com熱心網友回復:
該root變數僅參考根物件。這在擴展程序中不會改變。但是在該程序中,該物件的left和right屬性會更改值(從null到新節點)。
在回圈的第一次迭代中,currgets 參考與 相同的物件root,因此無論帶來什么變化都會curr被帶到root:兩個變數都可以訪問同一個物件。由于代碼設定curr.left為新節點并設定curr.right為新節點,此時root.left并root.right已設定為新節點。
在下一次迭代中,curr將參考那些新創建的節點之一(它們已經“附加”到root),并且在那里發生同樣的情況:由于curr變異,我們實際上變異了一個可以從 到達的節點root。該更深的節點使用由其left和/或right屬性參考的新節點進行擴展。
uj5u.com熱心網友回復:
我認為特林科特回答了你的問題。如果不清楚,請發表評論。
但是,如果你想有一個版本的這個不涉及突變,你可以做遞回時指出,從指數值形成的節點的左子i是從價值形成的一個索引2 * i 1從價值和右子在 index 2 * i 2,假設它們存在:
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}
這不使用您的 TreeNode 建構式。除非它比顯示的要多,否則我看不出有什么理由。但是如果我們需要使用它,我們可以替換它:
: {value: xs [i], left: toTree (xs, 2 * i 1), right: toTree (xs, 2 * i 2)}
有了這個:
: new TreeNode (xs [i], toTree (xs, 2 * i 1), toTree (xs, 2 * i 2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/339335.html
標籤:javascript 算法 树
