2

方法调用本身之后的语句何时执行?

private void inorderHelper(TreeNode node)
{
    if ( node==null )
        return;
    inorderHelper(node.leftNode);
    System.out.printf("%d", node.data);
    inorderHelper(node.rigthNode);
}

我只能看到代码行 inorderHelper(node.leftNode) 将继续迭代,直到 node == null 并且该方法在 node.data 打印之前立即终止。我认为我没有很好地递归,但我能找到的所有示例在递归调用之后都没有语句。我只想知道像 System.out.printf("%d",node.data) 这样的语句什么时候会在方法返回之前执行?

4

3 回答 3

2

您似乎在考虑方法的单个激活。在递归调用情况下,可以多次调用相同的方法。每个调用都有自己的堆栈帧。仅从调用它的激活返回。当它返回时,控制权被转移回调用它的激活,就像它被不同的方法调用一样。

递归调用之后的代码在每次激活中运行,在从它调用的激活返回时立即运行。

于 2012-12-18T04:48:02.267 回答
1

这个函数会递归遍历二叉树,直到遍历完左半边,然后打印数据,然后再遍历树的右半边

这在树的每一层都是相同的,这意味着在打印数据之前,您将在任何层看到打印树的左半部分,然后是右半部分。

如您的函数所示,这种处理方式称为“按顺序遍历”,其他方式是“前序遍历”,首先打印数据,以及“后序遍历”,最后打印数据。维基百科有更多信息。

为了更好地学习,您可以使用调试器逐步完成。

打个比方,想想《盗梦空间》,除了每个梦想都会暂停,直到内心的梦想结束。另一个区别是,在 Inception 中,外部梦境控制着内部梦境的终止,而在递归中,外部调用需要等到内部调用终止,才能继续。

于 2012-12-18T04:36:54.397 回答
0

尝试运行它,它应该可以帮助您获得一张好照片。

// first call with depth 0
private void inorderHelper(TreeNode node, int depth)
{
  ++depth;
  if ( node==null ) {
    System.out.printf("null node at depth %d", depth);
    return;
  }
  System.out.printf("depth %d data %d before left side", depth, node.data);
  inorderHelper(node.leftNode, depth);
  System.out.printf("depth %d data %d middle", depth, node.data);
  inorderHelper(node.rigthNode, depth);
  System.out.printf("depth %d data %d after right side", depth, node.data);
}
于 2012-12-18T04:59:56.337 回答