非递归方式如何用一个栈实现二叉树的后续遍历

142 阅读1分钟

前言:递归方式遍历二叉树不难,理解递归序就很简单——递归方式实现二叉树的三种遍历

非递归的方法就是不用系统栈,通过自己设计的压栈方式来实现——非递归方式实现二叉树的三种遍历

其中先序和中序只需用一个栈可以实现,比较好理解。后序用两个栈实现也好理解。但是一个栈也可以实现二叉树的后序遍历。所以单独拎出来写一篇博客记录!

关键是设置两个变量: 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();
	}