追踪二叉树

时间:2015-05-20 22:55:50

标签: java binary-tree binary-search-tree

我有以下二进制树

    3
   /  \
  5     2
 / \    /
1   4   6

我的周期是递归,所以请耐心等待我,我需要你的帮助来追踪它以使其正确。

我有以下代码,它的作用是在Post Order中打印节点。 所以答案是1 4 5 6 2 3

void Postorder(Node root) {

if(root == null){
    return;
}

Postorder(root.left);
Postorder(root.right);
System.out.print(root.data + " ");
}

让我们跟踪:

Root = 3(顶级节点),非null,Root.left(5) - 返回函数

Root = 5,非null,Root.left(1) - 返回函数

Root = 1,非null,Root.left(null),continue,Root.right(null)

打印1

现在这是我感到困惑的地方, Root = 1 此时,我不知道如何回到5,然后转到逻辑中的右边节点。另外,当我回到5时,我在哪里检查是否有1访问过?

我很困惑。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

Recursion Stack

也许图片会有所帮助。我发现递归也很困难,而且我发现图片很有用。在单独的窗口中打开图表并在侧面进行解释可能会很好。

首先,递归使用称为堆栈的东西。这是你在图中看到的四个矩形堆。例如,最后有两个空堆栈。假设函数A()B()终止之前调用函数A。然后需要发生的是我们在中途执行A(),然后执行B(),然后返回并完成执行A()。但是当我们去执行B()时,我们需要记住我们在A()的位置。因此,我们需要将有关A()B()的信息存储在堆栈中的各个矩形中。这样,在我们完成执行B()之后,我们知道在A()中我们离开的地方并且可以完成该功能。

因此,如果我们使用堆栈图逐步进行递归,那么它可能会有所帮助。还假设我们有这个:

public static void main( String[] args ) {
    Postorder(3);
}

1

所以最初,主要运行及其内容被添加到堆栈的底部,正如我们在第1部分中看到的那样。

1→2

但是当main()调用Postorder(3)时,它尚未终止。因此,在另一个堆栈帧中,我们添加了Postorder(3)函数调用的内容。您可以在第2部分中看到这一点。黄色箭头记住我们在执行另一个函数之前在每个堆栈帧中停止的位置。

2→3

现在,我们正在执行Postorder(3),我们到达函数调用Postorder(5)。但Postorder(3)尚未完成运行,因此在另一个堆栈框架中,我们必须添加Postorder(5)的内容。你可以在第3部分看到这一点。

3→4

现在我们正在执行Postorder(5)。我们到达函数调用Postorder(1)。但Postorder(5)尚未完成运行,因此在另一个堆栈框架中,我们必须添加Postorder(1)的内容。为简单起见,由于1没有子节点,我们会说Postorder(1)等同于Print(1)。这相当于第4部分。

4-→5

现在,在第4部分中,Print(1)执行,Postorder(1)终止。当Postorder(1)终止时,可以从堆栈中删除它。此外,自Postorder(1)完成后,我们可以继续执行Postorder(5)。黄色箭头告诉我们,在我们跳下执行另一个函数之前,我们在Postorder(5)的第1行停了下来。好吧,我们现在可以转到Postorder(5)的第2行。这相当于第5部分。

5→6

Postorder(5)的第2行是命令Postorder(4)。由于Postorder(5)尚未完成执行,我们必须将Postorder(4)的内容添加到另一个堆栈帧。这相当于第6部分。

...

从那时起,这几乎是一样的想法。如果您仍然希望我逐步完成剩下的8个部分,请告诉我。之后变得有点乏味。希望这个视觉有所帮助。

答案 1 :(得分:0)

是的,所以当你在Root 1(一片叶子)时,它将返回到调用它的节点(5)。

因为在" Root 5",它刚刚完成调用Postorder(root.left);(刚刚从打印1返回),下一行将运行并调用Postorder(root.right);

这将调用root = 4.不为null,root.left(null),continue,root.right(null),continue,now print 4

现在我们跳回到调用节点,root = 5.现在它已经被称为Root.left(1);Root.right(4);。现在它转到print 5

它现在将返回到调用节点 - 在这种情况下是整个树的根root = 3,现在它将以类似的方式遍历右侧。

答案 2 :(得分:0)

递归很简单。您需要做的就是不断将Binary Search Tree分成左右子树。

您也可以考虑为变量创建getters以更好地封装您的Node类。

延期交货功能

public void Postorder( Node root )
{
    if( root == null )
        return;

    // Output the left tree.
    if( root.left != null )
        Postorder( root.left );

    // Output the current node.
    System.out.print( root.data + " " );

    // Output the right tree.
    if( root.right != null )
        Postorder( root.right );        
}

答案 3 :(得分:-1)

Understanding and visualizing recursion Maybye这会对你有所帮助,因为你的理解递归是错误的。你需要记住所有函数调用。