我正致力于编码挑战。我找到了解决方案,但我不理解解决方案的一部分。
提示
Given a binary tree, find the leftmost value in the last row of the tree.
Input:
1
/ \
2 3
/ / \
4 5 6
/
7
Output:
7
树定义为:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
此功能有效(我没想出来):
var findBottomLeftValue = function(root) {
var result = root.val;
var resultHeight = 0;
(function recurse (node, height) {
if (node === null) {
return;
}
if (node.left !== null) {
recurse(node.left, height + 1);
}
if (height > resultHeight) {
result = node.val;
resultHeight = height;
}
if (node.right !== null) {
recurse(node.right, height + 1);
}
})(root, 1);
return result;
};
我理解大部分内容,但坦率地说,这是我第一次看到IIFE 里面的另一个函数,所以也许这让我有点失望。
我不明白的是,让我们说我们从root 1开始(使用上面的示例),它从node
开始为1.自node.left !== null
以来,节点现在是2,自node.left !== null
起,它下降到4. node.left
现在为空,它转到下一行,更新height
和resultHeight
。然后下一行,node.right
是 null,函数结束。根据我的理解,从不去检查节点3
,5
等。但该功能清楚地显示了正确的答案。
解决方案在哪里检查节点3
,5
,6
和7
?
答案 0 :(得分:2)
你的功能在第一次调用recurse()
(第9行)时向下移动。
如果完成左侧节点,它将在第二次调用recurse()
(第16行)时向右移动。
节点的顺序将是1 - > 2 - > 4 - > (2) - > (1) - > 3 - > 5 - > 7 - > (5) - > (3) - > 6 - > (3) - > (1)。
大括号中的节点显示调用堆栈减少的位置。
答案 1 :(得分:1)
如果你想象作为一个堆栈发生了什么,它会更容易理解
它从值为1的节点开始。当它检查左侧节点时,它将作为堆栈的第一项保留(当它再次成为堆栈的最顶层项时再次被调用)
当它在第二次迭代开始时看起来像这样:
2
---
1
然后,它将继续执行并添加到堆栈,直到它检查节点4没有左或右节点 此时,它看起来像这样:
4
---
2
---
1
然后,由于在值为4的节点上没有其他任何操作,它会从堆栈中删除,然后从它停止的位置执行堆栈的下一个最顶层:检查正确的节点它的。
我希望这能帮助你想象和理解真正发生的事情,因为这真的帮助我和一些大学同事了解二叉树。