有人可以向我解釋為什么給出這個代碼來遍歷二叉樹:
var sumOfLeftLeaves = function(root) {
let sum = 0;
traverse(root, sum);
return sum;
};
function traverse(root, sum) {
const left = root.left;
const right = root.right;
if (left) {
sum = left.val;
traverse(left, sum);
}
if (right) {
traverse(right, sum);
}
}
在樹的遍歷程序中正確計算的和,在退出最后一個遞回階段后被重置為 0?
uj5u.com熱心網友回復:
var sumOfLeftLeaves = function(root) {
let sum = 0;
return traverse(root, sum);
};
function traverse(root, sum) {
const left = root.left;
const right = root.right;
sum = root.val
if (left) {
sum = traverse(left, sum);
}
if (right) {
sum = traverse(right, sum);
}
return sum
}
sum是一個不可變的值。這意味著每次將它作為引數傳遞給函式呼叫時,都會生成一個新副本。因此,您在遞回堆疊中進一步添加的內容不會反映在sum上面堆疊幀中的變數上。
進一步說明,sum是一個整數,Number在 JS 術語中。它是一種值型別,這意味著在每次賦值時,它都是按值傳遞、復制的。換句話說,JS 運行時在堆疊上創建一個新位置并將分配的值存盤在新位置。您對值型別所做的任何更改/修改都不會反映在原始變數上。
這種方法解決了這個問題。
另一種方法是sum作為引數洗掉,只回傳節點值的總和,如下所示:
var sumOfLeftLeaves = function(root) {
return traverse(root);
};
function traverse(root) {
if (root == null) return 0
return root.val traverse(root.left) traverse(root.right);
}
為了完整起見,第三種方法是創建sum一個可變變數,如 js 物件型別或陣列。雖然物件或陣列的結構本身是按值傳遞的,但它們的內容可以更改,這些更改將反映在原始變數中。假設您sum作為一個元素的陣列傳遞,const sum = [0]。每當您向其中添加sum[0] = node.val內容時,索引零處的元素值都會發生sum變化,并且對于呼叫堆疊上方的函式也是可見的。
uj5u.com熱心網友回復:
您不會sum從回傳traverse,也不會在sumOfLeftLeaves其中重新分配它。你可能想要更像這樣的東西:
var sumOfLeftLeaves = function(root) {
return traverse(root, 0);
};
function traverse(root, sum) {
const left = root.left;
const right = root.right;
if (left) {
sum = left.val;
return traverse(left, sum);
}
if (right) {
return traverse(right, sum);
}
return sum;
}
uj5u.com熱心網友回復:
您可以采用單個函式回傳值加上左側和右側或零。
const
sumOfTree = node => node
? value sumOfTree(node.left) sumOfTree(node.right)
: 0;
另一種解決方案可能是使用遍歷函式,該函式接受一個節點和一個函式,該函式對值的物件具有閉包。
const
traverse = (node, fn) => {
if (!node) return;
fn(node);
traverse(node.left, fn);
traverse(node.right, fn);
},
sumOfTree = result => node => result.sum = node.value;
// call
const
result = { sum: 0 },
getSum = sumOfTree(result);
traverse(tree, getSum);
console.log(result.sum);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370736.html
標籤:javascript 算法 递归 二叉树
上一篇:查找字串是否有效的遞回方法
下一篇:如何將2個方法回圈在一起?
