【问题标题】:Binary Search Tree traverse method, what makes it go up from lowest left child(leaf)?二叉搜索树遍历方法,是什么让它从左下角的孩子(叶子)向上走?
【发布时间】:2016-05-23 19:55:23
【问题描述】:

我很难理解 SearchTree“按顺序遍历方法”在到达最左边的叶子后是如何上升的。我理解,首先根变成左子,然后再向下一级左子,直到它变成最低的左叶,没有左子也没有右子。好的。但是在根是最后一片叶子之后它如何升级。使 traverse 方法从最左边的子元素向上一级的确切代码行是什么。因为对于该节点,root.leftchild 和 root.rightchild 都为空。这对我来说很神奇。

public void inOrderTraverseTree(Node root) {

        if (root != null) {

            inOrderTraverseTree(root.leftChild);

            System.out.println(root);

            inOrderTraverseTree(root.rightChild);

        }

}

【问题讨论】:

    标签: binary-search-tree


    【解决方案1】:

    这是因为递归函数的属性,它在执行后返回给它的父调用函数。 例如
    20
    / \
    10 30

    这是一棵根为 20 的树。现在遍历您的 inOrderTraverseTree 代码: 1.调用inOrderTraverseTree(20) 2.检查root是否为null,这里20不为null。 3. 调用 inOrderTraverseTree(10) {left of 20 is 10} 4.检查root是否为null,这里10不为null。 5. 调用 inOrderTraverseTree(null) {left of 10 is null} 6.检查root是否为null,这里为null。因此退出“if”,返回调用函数,即步骤4{root=10} 7. 打印根目录,即打印 10。 8. 调用 inOrderTraverseTree(null) {right of 10 is null} 9.检查root是否为null,这里为null。因此退出“if”,返回调用函数,即步骤3{root=20}。{root=10的完整执行完成} 10.打印根,即打印20。 11.调用inOrderTraverseTree(30){20的右边是30} 12.检查root是否为空,这里30不为空。 13.call inOrderTraverseTree(null){left of 30 is null} 14.检查root是否为null,这里为null。因此退出“if”,返回调用函数,即步骤12{root=30} 15. 打印根目录,即打印 30。 16. 调用 inOrderTraverseTree(null) {right of 30 is null} 17.检查root是否为null,这里为null。因此退出“if”,返回调用函数,即步骤11{root=20}。{完成root=30的执行完成}

    这样,以根为 20 的 inOrderTraverseTree 调用的完整执行也完成了,打印的值为 10(在步骤 7 中)、20(在步骤 10 中)、30(在步骤 15 中):10 20 30。 现在进入“使 traverse 方法从最左边的孩子向上一级的代码”:您可以在步骤 9 中看到这种情况。当最左边的孩子的完整函数循环为时,最左边的孩子返回到其父调用函数完全执行。这是递归函数的主要性质。

    【讨论】:

    • 哇太棒了!谢谢!这正是我所需要的。
    【解决方案2】:

    假设您有一个堆栈,并且对inOrderTraverseTree(Node root) 的每次调用都通过某个指针存储在堆栈中(如果您不知道指针是什么,请想象有一个表示函数调用的变量)。

    所以,如果 inOrderTraverseTree(Node root) 被调用 n 次,堆栈将有 n 个指向函数的指针。

    您要问的是,在 n 次调用之后会发生什么?嗯,答案是,我们回到之前调用的函数。这是通过删除堆栈顶部的指针来完成的。现在,我们将在堆栈顶部拥有指向前一个函数调用的指针。

    简而言之,每次进行递归调用时,都会将指向函数的指针压入堆栈。一旦我们到达遍历的终点,我们从堆栈中一个一个地开始弹出元素。

    由于此操作仅涉及 pushpop,这正是 stack 存储函数调用的原因。

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多