二叉树重建

二叉树重建,相信同学们在学习数据结构的时候有做过相关的编程训练,如果忘记的话可以回去翻翻书~

二叉树重建其实离不开对前、中、后序遍历的理解

我这里只做了“已知前序和中序,重建二叉树”的笔记

我看过网上一些博主的做法,大部分是用递归的方法,但是在这里我采用了。。。当然也是递归啦!

代码如下:

package practice;


import java.util.Arrays;

public class TreeNode {
	TreeNode left;
	TreeNode right;
	int val;
	TreeNode(int x){
		val=x;
	}
	
	public static TreeNode reBuild(int[] preOrder,int[] inOrder){
//		for(int b:preOrder)
//			System.out.println(b);
		int len=preOrder.length;
		if(len<=0)
			return null;
		TreeNode root=new TreeNode(preOrder[0]);
		int i;
		//找到中序根节点的位置,则左右分别是左子树和右子树的节点
		for(i=0;i<len;i++){
			if(inOrder[i]==preOrder[0])
				break;
		}
		//System.out.println("len="+len+"  prefirstnum="+preOrder[0]+"   i="+i+",   i-1="+(i-1));
		//关于copyOfRange(original,from,to)函数还是好好看一下源码吧,一直卡在这,看了源码后才发现to的坑
		//preleft是左子树的前序遍历
		//inleft是左子树的中序遍历
		//preright是右子树的前序遍历
		//inright 是右子树的中序遍历
		int[] preleft=Arrays.copyOfRange(preOrder, 1, i+1);
		int[] inleft=Arrays.copyOfRange(inOrder,0,i);
		int[] preright=Arrays.copyOfRange(preOrder,i+1,len);
		int[] inright=Arrays.copyOfRange(inOrder,i+1,len);
		//递归核心思想
		root.left=reBuild(preleft,inleft);
		root.right=reBuild(preright,inright);
		return root;
	}
	
	public static void printTree(TreeNode t){
		if(null!=t){
			printTree(t.left);
			System.out.print(t.val+" ");
			printTree(t.right);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] preOrder=new int[]{1,2,4,7,3,5,6,8};
		int[] inOrder=new int[]{4,7,2,1,5,3,8,6};
		TreeNode node=reBuild(preOrder,inOrder);
		System.out.println("中序遍历:");
		printTree(node);
		
		
	}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值