在二叉搜索树上预先遍历遍历

时间:2014-12-29 23:17:40

标签: java binary-search-tree

对于二元搜索树: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);
}

2 个答案:

答案 0 :(得分:0)

方法preOrderTraversal(使用Node = 1作为参数调用,即使用左子节点)确实存在,但随后控制流跳回到调用它的方法,这又是{{1} }(使用Node = 7,根,作为参数调用)。一切都很好。

添加这些跟踪代码行,您将会这样做 明白我的意思,一切都会变得清晰。

preOrderTraversal

答案 1 :(得分:0)

欢迎来到Recursion的世界,让我们先来看一个Calculating Factorial的基本例子

Resursion

现在,当你看到已经创建了一堆方法调用时,这个递归的断点是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行!"从那里,正确的消息   (每行增加一个)最终会回到原点   问的人。