此函数如何遍历二叉树?

伊吉

我正在应对编码挑战。我找到了解决方案,但我不理解该解决方案的一部分。

提示是

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开始(使用上面的示例),它从node1开始。由于node.left !== null,节点现在为2,由于node.left !== null,它下降到4 node.left,现在为null,它转到下一行,更新heightresultHeight然后下一行,node.right 空的,函数结束。在我的理解,它从来没有去检查节点35等等。但是功能清楚地显示出正确的答案。

它根本上解决方案,检查节点3567

雷吉斯B.

如果您想像堆栈发生了什么,则更容易理解。
它从值1的节点开始。当它检查左节点时,它保持为堆栈的第一项(再次成为堆栈的最高项时将再次调用)
,当它看起来像这样时从第二个迭代开始:

2
---
1

然后,它将继续执行并添加到堆栈中,直到它检查节点4没有左节点或右节点为止。
此时,它看起来像这样:

4
---
2
---
1

然后,由于在值4的节点上没有其他事情可做,因此将其从堆栈中删除,然后从中断的位置开始执行堆栈的下一个最高层:检查它的右节点。

我希望这可以帮助您可视化并了解实际发生的情况,因为这确实帮助了我和一些大学的同事了解二叉树。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章