Java重建二叉树

输入前序和中序二叉树遍历的结果,重建出该二叉树。

直接上代码,可以参考代码中的相关注释。

首先定义树的结点结构,如下:

package tree;

public class Tree {
	public int val;
    public Tree left_child;
    public Tree right_child;
    public Tree(int val){
    	this.val=val;
    }
    public void display(){
    	System.out.println(val+" ");
    }
}

通过已知的遍历结果迭代实现二叉树的重建,如下:

package tree;

public class ConstructTree{
	public Tree construct(int[] pre,int[] in){
		if(pre.length ==0 || in.length == 0)
			return null;
		Tree head = buildTree(pre,0,pre.length-1,in,0,in.length-1);
		return head;
	}
    public Tree buildTree(int[] preOrder, int begin1, int end1, int[] inOrder, int begin2, int end2) {
	// TODO Auto-generated method stub
    	if(begin1>end1||begin2>end2){
    		return null;
    	}
    	int rootData = preOrder[begin1];//前序的第一个数字总是树的根节点包含的数值
    	Tree head = new Tree(rootData);//初始化树的根节点
    	int divider = findIndexInArray(inOrder,rootData,begin2,end2);//找到根节点的值在中序遍历数组中的位置(索引下标)
    	int offSet = divider -begin2 -1;//在中序遍历数组中,左子树最后一个结点的下标
    	
    	Tree left = buildTree(preOrder,begin1+1,begin1+1+offSet,inOrder,begin2,begin2+offSet);
    	Tree right = buildTree(preOrder,begin1+offSet+2,end1,inOrder,divider+1,end2);
    	head.left_child = left;
    	head.right_child = right;
    	
    	return head;
    }
	private int findIndexInArray(int[] a, int x, int begin, int end) {
		// TODO Auto-generated method stub
		for(int i = begin;i<=end;i++){
			if(a[i]==x)
				return i;
		}
		return -1;
	}
	public void inOrder(Tree n){
		if(n!=null){
			inOrder(n.left_child);
		    System.out.print(n.val+" ");
		    inOrder(n.right_child);
		}
	}
	public void preOrder(Tree n){
		if(n!=null){
			System.out.print(n.val+" ");
			preOrder(n.left_child);
			preOrder(n.right_child);
		}
	}
	public static void main(String[] args){
		ConstructTree build =new ConstructTree();
		int[] preOrder = {1,2,4,7,3,5,6,8};
		int[] inOrder = {4,7,2,1,5,3,8,6};
		Tree root = build.construct(preOrder, inOrder);
		
		build.preOrder(root);//检验构建的二叉树前序遍历是否正确
		System.out.println();
		build.inOrder(root);//检验构建的二叉树中序遍历是否正确
	}	
}


输出结果如下:

1 2 4 7 3 5 6 8 
4 7 2 1 5 3 8 6 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值