二叉树的非递归遍历

import java.util.Stack;

class Node{
	String data;
	Node lChild;
	Node rChild;
	public Node(String data){
		this.data=data;
		this.lChild=null;
		this.rChild=null;
	}
}

public class Demo {
	
	public static void preOrder(Node p){   //先序遍历
		Stack<Node> stack=new Stack<Node>();
		while(!stack.isEmpty()||p!=null){
			while(p!=null){   //遇到一个节点将其输出,将其右孩子压入栈中
				System.out.print(p.data); //然后处理其左孩子,而左孩子本身
				stack.push(p.rChild); //又可以看做一个节点
				p=p.lChild;
			}
			if(!stack.isEmpty()){  //输出到叶子节点后,从栈中弹出一节点
				p=stack.pop();
			}
		}
		System.out.println("");
	}
	
	public static void inOrder(Node p){  //中序遍历
		Stack<Node> stack=new Stack<Node>();
		while(p!=null||!stack.isEmpty()){
			while(p!=null){ //遇到一个节点后,先将其压入栈中
				stack.push(p); //然后处理其左孩子
				p=p.lChild;
			}
			if(!stack.isEmpty()){//处理到叶子节点后,从栈中弹出一个节点
				p=stack.pop();  
				System.out.print(p.data);
//				if(!stack.isEmpty()){  //这段代码表示在此节点出栈时,将
//					p=stack.pop();  //将其父节点也出栈,后来发现此段代码其实
//					System.out.print(p.data);//不必书写
//				}				
				p=p.rChild;  //处理其右孩子
			}
		}
		System.out.println("");
	}
	
	
	public static void postOrder(Node p){ //后序遍历
		Stack<Node> stack=new Stack<Node>();
		if(p==null) return;
		Node last=p;//记录上一个访问的节点
		stack.push(p);
		while(!stack.isEmpty()){
			p=stack.peek();
			// p没有孩子或者p如果有孩子,而且孩子都已经访问过,则访问p节点
			if((p.lChild==null&&p.rChild==null)||(p.rChild==null&&last==p.lChild)
					||last==p.rChild){
				System.out.print(p.data);
				last=p;
				stack.pop();
			}else{//p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
				if(p.rChild!=null)
					stack.push(p.rChild);
				if(p.lChild!=null)
					stack.push(p.lChild);
			}
		}
		System.out.println("");
	}
	
	public static void main(String[] args) {
		Node root=new Node("A");
		Node node1=new Node("B");
		Node node2=new Node("C");
		Node node3=new Node("D");
		Node node4=new Node("E");
		Node node5=new Node("F");
		Node node6=new Node("G");
		
		root.lChild=node1;
		root.rChild=node2;
		node1.lChild=node3;
		node1.rChild=node4;
		node2.lChild=node5;
		node2.rChild=node6;
		
		preOrder(root);
		inOrder(root);
		postOrder(root);
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值