前言:递归方式遍历二叉树不难,理解递归序就很简单——递归方式实现二叉树的三种遍历。
非递归的方法就是不用系统栈,通过自己设计的压栈方式来实现——非递归方式实现二叉树的三种遍历。
其中先序和中序只需用一个栈可以实现,比较好理解。后序用两个栈实现也好理解。但是一个栈也可以实现二叉树的后序遍历。所以单独拎出来写一篇博客记录!
关键是设置两个变量:
h:记录之前打印的结点的位置
c:记录栈顶的位置
public static void pos2(Node h) {
System.out.println("pos-order:");
if(h!=null) {
Stack<Node> stack=new Stack<>();
stack.push(h);
Node c=null;
while(!stack.isEmpty()) {
c=stack.peek();
if(c.left!=null && h!=c.left && h!=c.right) {
//左树没有处理完,就处理左树
stack.push(c.left);
}else if(c.right!=null && h!=c.right) {
//右树没有处理完,就处理右树
stack.push(c.right);
}else {
//左右两边都处理好了,就处理头节点
//每颗子树都如此,后序遍历是左右头,那么就好理解了
System.out.print(stack.pop().value+" ");
h=c;
}
}
}
System.out.println();
}