我正在应对编码挑战。我找到了解决方案,但我不理解该解决方案的一部分。
提示是
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 ,所以也许这让我有点不满意。
我不明白的是,假设我们从根1开始(使用上面的示例),它从node
1开始。由于node.left !== null
,节点现在为2,由于node.left !== null
,它下降到4 node.left
,现在为null,它转到下一行,更新height
和resultHeight
。然后下一行,node.right
是空的,函数结束。在我的理解,它从来没有去检查节点3
,5
等等。但是功能清楚地显示出正确的答案。
它根本上解决方案,检查节点3
,5
,6
和7
?
如果您想像堆栈发生了什么,则更容易理解。
它从值1的节点开始。当它检查左节点时,它保持为堆栈的第一项(再次成为堆栈的最高项时将再次调用)
,当它看起来像这样时从第二个迭代开始:
2
---
1
然后,它将继续执行并添加到堆栈中,直到它检查节点4没有左节点或右节点为止。
此时,它看起来像这样:
4
---
2
---
1
然后,由于在值4的节点上没有其他事情可做,因此将其从堆栈中删除,然后从中断的位置开始执行堆栈的下一个最高层:检查它的右节点。
我希望这可以帮助您可视化并了解实际发生的情况,因为这确实帮助了我和一些大学的同事了解二叉树。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句