递归法根据先序遍历和中序遍历重建二叉树(java实现)
具体代码
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
//空值返回null
if(pre.length==0)return null;
//根节点初始化
TreeNode root=new TreeNode(0);
root.val=pre[0];
//计算左子树和右子树中的节点个数
int left_num=FindRoot(pre[0],in);
int right_num=in.length-left_num-1;
//左子树递归赋值
if(left_num==0) root.left=null;
else root.left=reConstructBinaryTree(Arrays.copyOfRange(pre, 1 , left_num+1 ),
Arrays.copyOfRange(in,0,left_num));
//右子树递归赋值
if(right_num==0) root.right=null;
else root.right=reConstructBinaryTree(Arrays.copyOfRange(pre, left_num+1 , pre.length ),
Arrays.copyOfRange(in,left_num+1,in.length));
//返回根节点
return root;
}
//计算根的位置
public int FindRoot(int root,int[]in){
for(int i=0;i<in.length;i++){
if(root==in[i]){
return i;
}
}
return -1;
}
关于Arrays.copyOfRange()方法
有三个参数,第一个表示源数组,第二个from的下标,第三个to的下标(from<=范围<to)