【问题标题】:Recursion in tree traversal树遍历中的递归
【发布时间】:2017-05-11 03:24:36
【问题描述】:
我是图和树概念的新手。下面是树的中序树遍历。
if(n!=null){
treeTraversal(n.left);
System.out.println(n.val);
treeTraversal(n.right);
}
我无法理解流程,因为它涉及递归。有人可以解释一下关于堆栈的控制流是如何发生的吗?
【问题讨论】:
标签:
java
recursion
data-structures
tree
【解决方案1】:
假设我有一棵树,它类似于:
4
/ \
2 5
/ \
1 3
您的代码将首先通过左孩子 4 -> 2 -> 1 进行递归。由于 1 没有左孩子(它为空),它将打印 1 然后弹出堆栈。递归的下一个是 2。它将打印 2,然后遍历 2 的右孩子,即 3。它将打印 3,然后弹出堆栈。然后它会打印 4,然后是 4 的右孩子 5。打印的顺序是 1、2、3、4、5。Here 也是一个很好的动画。
【解决方案2】:
这是一个 inOrder 遍历,如果存在,则首先访问左子节点,如果不存在,则打印点头,然后遍历到左节点
例如,在这棵树中,您的代码输出将是
10, 4, 11, 2, 5, 9, 1, 7, 6, 8, 3
我们也有preOrder 和postOrde 遍历
预购
preorder(Node N)
if (N != null)
Visit N;
for each child Y of N
preorder(Y);
并发布订单
postorder(Node N)
if (N != null)
for each child Y of N
postorder(Y);
Visit N;
【解决方案3】:
图片用一个简单的树展示了代码的执行,它应该可以帮助你理解递归是如何工作的,只需按照箭头。
在每个堆栈下都有一个以黄色显示当前节点的树形图(单击图像以展开它):