用java实现二叉树非递归的前序,中序,后序遍历算法

用了非递归的2种办法,栈

package BinaryTree;

public class TreePoint  {
	public String name;
	private TreePoint leftNode;
	private TreePoint rightNode;
	private TreePoint parent;
	private boolean visit=false;
	
	public TreePoint(String name){
		this.name = name;
	}
	
	public TreePoint(String name,TreePoint leftNode,TreePoint rightNode){
		this.name = name;
		this.leftNode = leftNode;
		this.rightNode = rightNode;
	}
	
	public TreePoint getLeftNode(){
		if(leftNode!= null&&leftNode.isVisited()){
			return null;
		}
		return leftNode;
	}
	
	public void setLeftNode(TreePoint leftNode){
		this.leftNode = leftNode;
	}
	
	public TreePoint getRightNode(){
		if(rightNode!= null&&rightNode.isVisited()){
			return null;
		}
		return rightNode;
	}
	
	public void setRightNode(TreePoint rightNode){
		this.rightNode= rightNode;
	}
	
	public boolean isVisited(){
		return visit;
	}
	
	public void setVisit(boolean visit){
		this.visit = visit;
	}
	
	public TreePoint getParent(){
		return parent;
	}
	
	public void setParent(TreePoint parent){
		this.parent = parent;
	}
	
	public String toString(){
		setVisit(true);
		return name;
	}
}
package BinaryTree;

import java.util.Stack;

public class TreeTest {
	private static TreePoint root=null;
	
	public static void TreeInit(){
		TreePoint A = new TreePoint("A");
		root = A;
		TreePoint B = new TreePoint("B");
		TreePoint C = new TreePoint("C");
		A.setLeftNode(B);
		A.setRightNode(C);
		B.setParent(A);
		C.setParent(A);
		TreePoint D = new TreePoint("D");
		TreePoint E = new TreePoint("E");
		B.setLeftNode(D);
		B.setRightNode(E);
		D.setParent(B);
		E.setParent(B);
		TreePoint F = new TreePoint("F");
		TreePoint G = new TreePoint("G");
		C.setLeftNode(F);
		C.setRightNode(G);
		F.setParent(C);
		G.setParent(C);
		TreePoint H = new TreePoint("H");
		TreePoint I = new TreePoint("I");
		E.setLeftNode(H);
		E.setRightNode(I);
		H.setParent(E);
		I.setParent(E);
		TreePoint J = new TreePoint("J");
		G.setRightNode(J);
		J.setParent(G);
	}
	
	public static void check(TreePoint root,String SortName){
		if(root==null){
			System.out.println("空树");
			System.exit(0);
		}
		System.out.println(SortName);
	}
	
	public void testFirst(){
		 check(root,"先序遍历");
		 TreePoint next = root;
		 while(next!=null){
			 if(!next.isVisited()){
				 System.out.print(next+" ");
			 }
			 TreePoint flag = next.getLeftNode();
			 if(flag==null){
				 flag = next.getRightNode();
				 if(flag == null){
					 next = next.getParent();
					 continue;
				 }
				 next = flag;
				 continue;
			 }
			 next = flag;
		 }
	}
	
	public void testMiddle(){
		check(root,"中序遍历");
		TreePoint next = root;
		while(next!=null){
			TreePoint flag = next.getLeftNode();
			if(flag==null){  //当左字树都为空的时候,将其打印出来
				if(!next.isVisited()){
					System.out.print(next+" ");
				}
				flag=next.getRightNode();
				if(flag==null){
					next = next.getParent();
				}else{
					next = flag;
				}
			}else{
				next = flag;
			}
		}
	}
	
	public void testLast(){
		check(root,"后序遍历");
		TreePoint next = root;
		while(next!= null){
			TreePoint flag = next.getLeftNode();
			if(flag==null){
				flag = next.getRightNode();
				if(flag==null){
					if(!next.isVisited()){
						System.out.print(next+" ");
					}
					next = next.getParent();
				}else{
					next = flag;
				}
			}else{
				next = flag;
			}
		}
	}
	
	public void Middle(){
		Stack<TreePoint> s = new Stack<TreePoint>();
		check(root,"中序遍历");
		TreePoint next=root;
		while(next!=null||!s.isEmpty()){
			if(next!=null){
				s.push(next);
				next = next.getLeftNode();
			}else{
				next = (TreePoint) s.pop();
				System.out.print(next+" ");
				next = next.getRightNode();
			}
		}
	}
	
	public void Last(){
		Stack<TreePoint> s = new Stack<TreePoint>();
		TreePoint next = root;
		while(next!=null||!s.isEmpty()){
			while(next!=null){
				s.push(next);
				next = next.getLeftNode();
			}
				next = s.pop();
				if(next.getRightNode()==null){
					System.out.print(next+" ");
				}else{
					next = next.getRightNode();
			}
		}
	}
	
	public static void main(String args[]){
		TreeTest tt = new TreeTest();
		tt.TreeInit();
	//	tt.testFirst();
	//	tt.testMiddle();
//		tt.testLast();
//		tt.Middle();
		tt.Last();
		
	}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值