对于二元搜索树:7是根1是左子,10是右子。
7
1 10
我试过调试这个函数来看它是如何工作的,我似乎无法理解一件事。在函数检查并看到1的左子节点和右子节点都为空之后,它继续移动到节点10,然后检查右子节点是否为空。有人可以解释递归模式以及为什么在初始检查节点1后方法不会退出。
private void preOrderTraversal(Node node)
{
if(node == null) return;
System.out.println(node.data);
preOrderTraversal(node.leftChild);
preOrderTraversal(node.rightChild);
}
答案 0 :(得分:0)
方法preOrderTraversal
(使用Node = 1作为参数调用,即使用左子节点)确实存在,但随后控制流跳回到调用它的方法,这又是{{1} }(使用Node = 7,根,作为参数调用)。一切都很好。
添加这些跟踪代码行,您将会这样做 明白我的意思,一切都会变得清晰。
preOrderTraversal
答案 1 :(得分:0)
欢迎来到Recursion的世界,让我们先来看一个Calculating Factorial
的基本例子
现在,当你看到已经创建了一堆方法调用时,这个递归的断点是factorial(0) whose result is 1
,这是我们得到的第一个值
现在此时程序不会退出,而第五次调用会将结果(i.e. 0)
返回到第四次调用,依此类推,以便您可以得到最终的结果。一旦任何方法返回结果,它就会从递归调用堆栈中删除
现在来看你的遍历树的例子
System.out.println(node.data); // prints 7 for first time
preOrderTraversal(node.leftChild); // Now the function is called with 7->left
preOrderTraversal(node.rightChild);// here is is called with 7->right
所以同样的方式创建递归调用堆栈,程序而不是退出1
将返回给调用它的方法(即7-> left)
现在(7->右)将被执行
现在以外行术语递归
电影院里的某个人问你坐在哪排。你 不想算数,所以你问前面的人是什么排 他们坐在那里,知道你会回应一个大于 他们的答案。前面的人会问前面的人 他们。这将继续发生,直到单词到达前排,并且 它很容易回应:"我在第1行!"从那里,正确的消息 (每行增加一个)最终会回到原点 问的人。