【问题标题】:Pre-order Traversal on a Binary Search Tree二叉搜索树上的先序遍历
【发布时间】:2014-12-29 23:17:40
【问题描述】:

对于二叉搜索树:7 是根 1 是左孩子,10 是右孩子。

                                        7
                                      1   10

我已尝试调试此功能以查看其工作原理,但我似乎无法理解一件事。在函数检查并看到 1 的左孩子和右孩子都为 null 之后,它移动到节点 10,然后检查右孩子是否为 null。有人可以解释递归模式以及为什么在初始检查节点 1 后该方法不退出。

private void preOrderTraversal(Node node)
{       
    if(node == null) return; 
    System.out.println(node.data);
    preOrderTraversal(node.leftChild);
    preOrderTraversal(node.rightChild);
}

【问题讨论】:

  • 别打扰,重用existing tools
  • @fge 虽然现有工具会对您有很大帮助,尤其是在生产应用程序期间,但构建自己的东西非常有教育意义。

标签: java binary-search-tree


【解决方案1】:

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

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

private void preOrderTraversal(Node node)
{
    System.out.println("Now in preOrderTraversal with " + 
                       (node==null ? "null." : node.data + "."));
    if(node == null) {
        System.out.println("Done. Exit 1 taken.");
        return;
    }
    System.out.println(node.data);
    preOrderTraversal(node.leftChild);
    preOrderTraversal(node.rightChild);
    System.out.println("Done. Exit 2 taken.");
}

【讨论】:

  • 谢谢你。但是它如何/为什么跳回具有 7 节点的方法。确定没有调用根为 7 的递归函数吗?
  • preOrderTraversal 应该首先使用节点 7 调用,然后它将在 7 处打印数据,然后是左子节点,然后是右节点。调用堆栈类似于 [7](第一次调用)[71](左孩子)[71null](左孩子的左孩子)[71null](左孩子的右孩子),然后继续执行 71 并变为 [7 10 ]等
【解决方案2】:

欢迎来到递归的世界,让我们从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->左) 现在 (7->right) 将被执行


现在外行的递归

电影院里有人问你坐在哪一排。你 不想数,所以你问前面的人是第几排 他们坐在里面,知道你的反应会比 他们的回答。前面的人会问前面的人 他们。这将一直发生,直到单词到达前排,并且 很容易回答:“我在第一排!”从那里,正确的信息 (每行增加一个)最终会回到 问的人。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多