根据遍历的特性,找到根,算出左子树和右子树的范围,再进行递归重建。
/**
* pre {1, 2,4,7, 3,5,6,8}
* mid {4,7,2, 1, 5,3,8,6}
*/
static TreeNode reBuild(int[] pre, int[] mid) {
int rootValue = pre[0];
TreeNode root = new TreeNode(rootValue);
int i;
for (i = 0; i < mid.length; i++) {
if (mid[i] == rootValue)
break;
}
if (i > 0 && i != mid.length) {
int[] newMid = new int[i];
int[] newPre = new int[i];
System.arraycopy(mid, 0, newMid, 0, i);
System.arraycopy(pre, 1, newPre, 0, i);
root.left = reBuild(newPre, newMid);
}
if (i != mid.length - 1) {
int rightLen = mid.length - i - 1;
int[] newMid = new int[rightLen];
int[] newPre = new int[rightLen];
System.arraycopy(mid, i + 1, newMid, 0, rightLen);
System.arraycopy(pre, i + 1, newPre, 0, rightLen);
root.right = reBuild(newPre, newMid);
}
return root;
}
static void pre(TreeNode root) {
if (root == null) return;
System.out.print(root.value + " ");
pre(root.left);
pre(root.right);
}
static void mid(TreeNode root) {
if (root == null) return;
mid(root.left);
System.out.print(root.value + " ");
mid(root.right);
}
public static void main(String[] args) {
int[] test = {1, 2,4,7, 3,5,6,8};
int[] test1 = {4,7,2, 1, 5,3,8,6};
TreeNode treeNode = reBuild(test, test1);
pre(treeNode);
System.out.println();
mid(treeNode);
}