非递归前序
法一(技巧)
- 非递归的前序。我们利用栈的性质替代递归,因为递归有时候在效率方面不是令人满意的。
- 利用栈,我们直到栈的顺序为现金先出。那么顺序如何添加?递归是左递归,右递归。但是利用栈要相反,因为如果左进栈、右进栈会出现以下后果:
![a173c9c2d2e4f39c8459971a4ca4bea1.png](https://img-blog.csdnimg.cn/img_convert/a173c9c2d2e4f39c8459971a4ca4bea1.png)
- 所以,我们要利用递归的思路,需要先放右节点进栈,再放左节点进栈,这个下次·再取节点取到左节点·,这个节点再右节点进栈,左节点进栈。然后循环一直到最后会一直优先取到左节点。达到和递归顺序相仿效果。
![19c7eac7e3550f1763aaa508d497a181.png](https://img-blog.csdnimg.cn/img_convert/19c7eac7e3550f1763aaa508d497a181.png)
- 每pop完添加右左节点直接输出(访问)即可完成前序非递归遍历。
public void qianxu3(node t)// 非递归前序 栈 先左后右 t一般为root
{
Stack q1 = new Stack();
if (t == null)
return;
if (t != null) {
q1.push(t);
}
while (!q1.empty()) {
node t1 = q1.pop();
if (t1.right != null) {
q1.push(t1.right);
}
if (t1.left != null) {
q1.push(t1.left);
}
System.out.print(t1.value + " ");
}
}
法二(传统)
方法二和非递归中序遍历的方法类似,只不过需要修改输出时间,在进栈时候输入访问节点即可。具体参考中序遍历分析。
public vo