package DataStructure;
import java.util.ArrayList;
import java.util.List;
public class niukewang {
/*
* 本地解决的是二叉树已经前序排列中序排列求二叉树
*
*
* 并且已经序列中不存在val相等的节点
* 每个节点都是唯一的一个
*
*
*/
/*
* 基础
* 1了解什么是前序排列
* 2了解什么是后序排列
*
*
* 方法核心即
* 前序排列的第一个元素为root
* 在中序排列中找到root对应的位置记住为 i
* 那么中序排列中i的左边为root的左子树
* 右边为右子树
*
* 此时根据左子树的中序排列和前序排列查找左子树的root
* 遍历前序中的元素第一个出现在左子树中序列中的元素即为root
* 不断递归即可求解书
*
*
*
*
*
*/
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root=null;
if(in.length==0)//中序为空
return null;
if(in.length==1)//中序为长度1时此点即为root点
{
root=new TreeNode(in[0]);
System.out.println(root);
return root;
}
if(in.length==pre.length)//初始状态前序中序长度一致 前序第一个为根节点
root =new TreeNode(pre[0]);
else {
//子树操作过程
for(int j=0;j<pre.length;j++)//遍历前序查找在中序中第一个相等的数作为root
{
for(int i=0;i<in.length;i++)
{
if(in[i]==pre[j])
{
root=new TreeNode(in[i]);
break;
}
}
if(root!=null)
break;
}
}
int [] lefin = null; //左子树中序
int [] rightin = null;//右子树中序
for(int i=0;i<in.length;i++)
{
if( root.val == in[i])
{
lefin=new int[i];
rightin=new int[in.length-1-i];
System.arraycopy(in, 0, lefin, 0,i);
System.arraycopy(in, i+1, rightin, 0, in.length-1-i);
}
}
System.out.println(root);
root.left=reConstructBinaryTree(pre, lefin);
root.right=reConstructBinaryTree(pre, rightin);
return root;
}
public static void main(String[] args) {
System.out.println(
reConstructBinaryTree(new int[]{1,2,4,3,5,6},new int []{4,2,1,5,3,6}));
}
}
class TreeNode {
public TreeNode(){};
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
public String toString(){
return val+””;
}
}