二叉树重建

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

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

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

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

代码如下:

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);
		
		
	}

}

全部评论

相关推荐

移动云能力 苏小妍 总包多3w左右
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务