关于java:树遍历中的递归

Recursion in tree traversal

我对图和树的概念是新手。下面是树的中序树遍历。

1
2
3
4
5
 if(n!=null){
     treeTraversal(n.left);
     System.out.println(n.val);
     treeTraversal(n.right);
 }

我无法理解流程,因为它涉及递归。有人可以解释一下关于堆栈的控制流是如何发生的吗?


该图显示了代码的执行过程,其中包含一个简单的树,它应该可以帮助您了解递归的工作原理,只需按照箭头即可。

在每个堆栈下都有一个以黄色显示当前节点的树形图(单击图像展开它):

tree


假设我有一棵树,它类似于:

1
2
3
4
5
    4
   / \\
  2   5
 / \\
1   3

您的代码将首先通过左孩子 4 -> 2 -> 1 进行递归。由于 1 没有左孩子(它为空),它将打印 1 然后弹出堆栈。递归的下一个是 2。它将打印 2,然后遍历 2 的右孩子,即 3。它将打印 3,然后弹出堆栈。然后它会打印 4,然后是 4 的右孩子 5。打印的顺序是 1、2、3、4、5。这也是一个很好的动画。


这是一个 inOrder 遍历,如果存在,则首先访问左子节点,如果不存在,则打印点头,然后遍历到左节点enter

1
2
3
4
5
preorder(Node N)
if (N != null)
Visit N;
for each child Y of N
preorder(Y);

并发布订单

1
2
3
4
5
postorder(Node N)
if (N != null)
for each child Y of N
postorder(Y);
Visit N;