public static TreeNode reConstructTreeNode(int[] pre,int[] in)
{
//获取节点的根
int rootVal = pre[0];
//定义一个节点,将根节点值赋值给构造的节点
TreeNode treeNode = new TreeNode(rootVal);
//获取根的左子树的中序
ArrayList<Integer> li = new ArrayList<Integer>();
int rootPos = 0;
for (int i = 0; rootVal != in[i] ; i++) {
rootPos ++;
li.add(in[i]);
}
//获取根的右子树的中序
ArrayList<Integer> ri = new ArrayList<Integer>();
for (int i = rootPos + 1; i < in.length; i++) {
ri.add(in[i]);
}
//获取根的左子树的先序
ArrayList<Integer> lp = new ArrayList<Integer>();
for (int i = 1; i < rootPos + 1; i++) {
lp.add(pre[i]);
}
//获得根的右子树的先序
ArrayList<Integer> rp = new ArrayList<Integer>();
for (int i = rootPos + 1; i < pre.length; i++) {
rp.add(pre[i]);
}
if(lp.size() == 0 || li.size() == 0)
{
treeNode.leftTree = null;
}
else if(rp.size() == 0 || rp.size() == 0)
{
treeNode.rightTree = null;
}
//若左右子树都不为空
if(lp.size() != 0)
{
//左先序赋值给数组
int[] lpArr = new int[lp.size()];
for (int i = 0; i < lpArr.length; i++) {
lpArr[i] = lp.get(i);
}
//左中序赋值给数组
int[] liArr = new int[li.size()];
for (int i = 0; i < liArr.length; i++) {
liArr[i] = li.get(i);
}
//右先序赋值给数组
int[] rpArr = new int[rp.size()];
for (int i = 0; i < rpArr.length; i++) {
rpArr[i] = rp.get(i);
}
//右先序赋值给数组
int[] riArr = new int[ri.size()];
for (int i = 0; i < riArr.length; i++) {
riArr[i] = ri.get(i);
}
treeNode.leftTree = reConstructTreeNode(lpArr, liArr);
}
if(rp.size() != 0)
{
//左先序赋值给数组
int[] lpArr = new int[lp.size()];
for (int i = 0; i < lpArr.length; i++) {
lpArr[i] = lp.get(i);
}
//左中序赋值给数组
int[] liArr = new int[li.size()];
for (int i = 0; i < liArr.length; i++) {
liArr[i] = li.get(i);
}
//右先序赋值给数组
int[] rpArr = new int[rp.size()];
for (int i = 0; i < rpArr.length; i++) {
rpArr[i] = rp.get(i);
}
//右先序赋值给数组
int[] riArr = new int[ri.size()];
for (int i = 0; i < riArr.length; i++) {
riArr[i] = ri.get(i);
}
treeNode.rightTree = reConstructTreeNode(rpArr, riArr);
}
return treeNode;
}
节点的类:
class TreeNode
{
int Val;
TreeNode leftTree;
TreeNode rightTree;
TreeNode(int Val)
{
this.Val = Val;
}
}