print语句究竟是如何在这两种方法中起作用的?

时间:2016-07-19 16:12:15

标签: java algorithm recursion tree

这是二元搜索树。我正在以两种方式遍历树.1)InOrder Traversal 树t的inorder遍历是跟随左子树的递归算法;一旦没有剩余的子树要处理,我们处理正确的子树。元素以左右根顺序处理。 2)PostOrder Traversal 树t的后序遍历是在处理根元素之前遵循左右子树的递归算法。元素按左右根顺序处理。

我对递归方法和print语句的工作原理感到困惑。能不能请你开导?

static void inOrder(Leaf root){
    if(root != null){
        inOrder(root.left);
        System.out.print(root.value+" ");
        inOrder(root.right);
    }
}
static void postOrder(Leaf root){
    if(root != null){
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.value+" ");
    }
}

2 个答案:

答案 0 :(得分:1)

这种方法的工作方式是每个函数都会打印出一个包含树中每个值的长行。当每个算法遍历树时,它会将节点的当前值与空格一起附加到输出。例如,如果我们考虑以下树:

  2
 / \
1   3

第一个算法将从2开始,然后在左子项1上调用自身。然后该函数将在左子项上调用自身,该子项为null,因此它将立即返回。然后该功能将打印" 1"到控制台。该函数将在右子项上调用自身,该子项为null,因此它将立即返回。然后该功能将返回到2," 2"将打印到控制台。然后该函数将自己调用自己的子项,即3,该函数将自动调用左子项,该子项返回,然后打印" 3"到控制台,然后在正确的孩子身上调用自己,然后返回。然后该函数将返回到2,并返回到调用它的任何内容。最后的控制台会说

1 2 3 

第二种算法会发生类似的情况,除了函数在打印根节点2之前分别打印并打印左右子节点1和3,导致以下输出:

1 3 2 

如果您无法理解它,那么为您自己绘制树并按照代码逐步查看计算机正在执行的操作将会对您有所帮助。

答案 1 :(得分:0)

作为每个递归方法,它需要一个基本情况,一个停止递归的条件。在这种情况下,当" root"是空的。

观察变量root,只是方法中第一次调用时Tree的实际根。连续的调用是将元素传递给它的左侧或右侧。

在方法inOrder中,它会打印树的左侧分支上更下方的元素。所以它会降低水平"在调用打印之前在树上。这意味着如果元素在左侧分支上有一个叶子,它将在前往右侧分支之前打印所述叶子。

在postOrder方法中,它将在它可以去的树上最下面然后打印元素,为两个分支(左和右)执行此操作。这意味着将首先打印thre树的叶子,而实际的根将是最后一个元素。

如果您在查看时遇到问题,我建议您使用Eclipse上的Debug在一张纸上绘制树并使用一个小样本树运行代码,这样您就可以逐行跟踪执行,看看如何算法遍历树。