您的位置:首页 > 其它

二叉树重建

2018-03-18 21:21 357 查看
二叉树重建,相信同学们在学习数据结构的时候有做过相关的编程训练,如果忘记的话可以回去翻翻书~
二叉树重建其实离不开对前、中、后序遍历的理解
我这里只做了“已知前序和中序,重建二叉树”的笔记
我看过网上一些博主的做法,大部分是用递归的方法,但是在这里我采用了。。。当然也是递归啦!
代码如下: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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: