二叉搜索树遍历方法,是什么让它从左下角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 到之前调用的函数。这是通过删除堆栈顶部的指针来完成的。现在,我们将在堆栈顶部拥有的是指向前一个函数调用的指针。
简而言之,每次进行递归调用时,都会将指向函数的指针压入堆栈。一旦我们到达遍历的终点,我们就开始一个一个地从堆栈中弹出元素。
由于此操作仅涉及 push 和 pop,这就是 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 到其父调用函数。这是递归函数的主要属性。
我很难理解 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 到之前调用的函数。这是通过删除堆栈顶部的指针来完成的。现在,我们将在堆栈顶部拥有的是指向前一个函数调用的指针。
简而言之,每次进行递归调用时,都会将指向函数的指针压入堆栈。一旦我们到达遍历的终点,我们就开始一个一个地从堆栈中弹出元素。
由于此操作仅涉及 push 和 pop,这就是 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 到其父调用函数。这是递归函数的主要属性。