二叉树非递归遍历

先序遍历

先序遍历顺序:中左右
首先构造一个栈,将根节点压入栈。然后弹出栈顶部元素,打印输出,再压入弹出元素的右儿子和左儿子(注意顺序)。
这时再开始循环,弹出栈顶元素,打印输出,再压入弹出元素的右儿子和左儿子,直到最后栈元素为空

 public void before(Node root) {
    	if(root==null)
    		return;
    	Stack<Node> stack=new Stack<Node>();
    	stack.push(root);
    	while(!stack.isEmpty()) {
    		Node out=stack.pop();
    		System.out.println(out.val+"-->");
    		if(out.right!=null)
    			stack.push(out.right);
    		if(out.left!=null)
    			stack.push(out.left);
    	}
    }

后序遍历

后序遍历顺序:左右中
想象上面先序的输出的顺序,中左右
我们把这段代码左右进栈的顺序变一下,不就成了中右左吗?

			if(out.right!=null)
    			stack.push(out.right);
    		if(out.left!=null)
    			stack.push(out.left);

然后我们在打印输出的时候不打印,而是再创建一个栈,在打印的时候把元素压入栈,这样不就从
中右左变成左右中,变成后序遍历了吗?

 public void after(Node root) {
    	if(root==null)
    		return;
    	Stack<Node> stack=new Stack<Node>();
    	Stack<Node> outStack=new Stack<Node>();
    	stack.push(root);
    	while(!stack.isEmpty()) {
    		Node out=stack.pop();
    		outStack.push(out);
    		if(out.left!=null)
    			stack.push(out.left);
    		if(out.right!=null)
    			stack.push(out.right);
    	}
    	while(!outStack.isEmpty()) {
    		System.out.println(outStack.pop().val+"->");
    	}
    }

中序遍历

将指定节点的左儿子的左儿子的左儿子压入栈.直到该节点为空。然后栈里弹出一个,打印信息,再将该节点右儿子压入栈,开始循环上面的过程。

 public void in(Node root) {
    	if(root==null)
    		return;
    	Stack<Node> stack=new Stack<Node>();
    	Node cur=root;
    	while(!stack.isEmpty()||cur!=null) {
    		if(cur!=null) {
    			stack.push(cur);
    			cur=cur.left;
    		}else {
    			cur=stack.pop();
    			System.out.println(cur.val+"->");
    			cur=cur.right;
    		} 			
    	}
    }
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值