这个函数如何遍历二叉树?

时间:2017-12-05 17:33:33

标签: javascript iife

我正致力于编码挑战。我找到了解决方案,但我不理解解决方案的一部分。

提示

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现在为空,它转到下一行,更新heightresultHeight。然后下一行,node.right null,函数结束。根据我的理解,从不去检查节点35等。但该功能清楚地显示了正确的答案。

解决方案在哪里检查节点3567

2 个答案:

答案 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的节点上没有其他任何操作,它会从堆栈中删除,然后从它停止的位置执行堆栈的下一个最顶层:检查正确的节点它的。

我希望这能帮助你想象和理解真正发生的事情,因为这真的帮助我和一些大学同事了解二叉树。