二叉搜索树遍历方法,是什么让它从左下角child(叶子)开始?

Binary Search Tree traverse method, what makes it go up from lowest left child(leaf)?

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

public void inOrderTraverseTree(节点根) {

        if (root != null) {

            inOrderTraverseTree(root.leftChild);

            System.out.println(root);

            inOrderTraverseTree(root.rightChild);

        }

}

想象一下你有一个堆栈,每次对 inOrderTraverseTree(Node root) 的调用都通过一些指针存储在堆栈中(如果你不知道指针是什么,想象一下有一个代表函数调用的变量).

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

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

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

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

这是因为递归函数的 属性 执行后 return 到它的父调用函数。 例如
20
/ \
10 30

这是一棵根为 20 的树。现在遍历您的 inOrderTraverseTree 代码: 1.调用inOrderTraverseTree(20) 2.检查root是否为空,这里20不为空。 3.调用inOrderTraverseTree(10) {20的左边是10} 4.检查root是否为空,这里10不为空。 5. 调用 inOrderTraverseTree(null) {10 的左边为空} 6.检查root是否为null,这里是null.Hence退出"if",return调用函数,即第4步{root=10} 7. 打印根,即打印 10。 8. call inOrderTraverseTree(null) {10的右边为null} 9.检查root是否为null,这里是null.Hence退出"if",return调用函数,即第3步{root=20}。{root=10完成执行完成了} 10.print 根,即打印 20。 11.call inOrderTraverseTree(30){20的右边是30} 12.check root为null,这里30不为null。 13.call inOrderTraverseTree(null){30 的左边为 null} 14.检查root是否为null,这里是null.Hence退出"if",return调用函数,即第12步{root=30} 15.打印root,即打印30。 16. call inOrderTraverseTree(null) {30的右边为null} 17.检查root是否为null,这里是null.Hence退出"if",return调用函数,即第11步{root=20}。{root=30完成执行已完成}

至此,使用 root 20 的 inOrderTraverseTree 调用的完整执行也已完成,打印的值为 10(在第 7 步中)、20(在第 10 步中)、30(在第 15 步中):10 20 30。 现在来到 "code that makes the traverse method go one level up from the lowest left child" :您可以在第 9 步中看到这种情况。当最左边的子项的完整函数循环完全执行时,最左边的子项被 returned 到其父调用函数。这是递归函数的主要属性。