Recursion in tree traversal
我对图和树的概念是新手。下面是树的中序树遍历。
1 2 3 4 5 |
我无法理解流程,因为它涉及递归。有人可以解释一下关于堆栈的控制流是如何发生的吗?
该图显示了代码的执行过程,其中包含一个简单的树,它应该可以帮助您了解递归的工作原理,只需按照箭头即可。
在每个堆栈下都有一个以黄色显示当前节点的树形图(单击图像展开它):
假设我有一棵树,它类似于:
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 遍历,如果存在,则首先访问左子节点,如果不存在,则打印点头,然后遍历到左节点
例如,在这棵树中,您的代码输出将是
10, 4, 11, 2, 5, 9, 1, 7, 6, 8, 3
我们也有
预购
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; |