问题描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
Java代码如下
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre == null || in == null || pre.length <= 0 || in.length <= 0) {
return null;
}
TreeNode root = new TreeNode(pre[0]);
int i = 0;
for (; i < in.length; i++) {
if (in[i] == root.val) {
break;
}
}
// 递归构造左子树 把左子树的先序、中序遍历找出来,递归构造。
if (i > 0) {
int[] preO = new int[i];
int[] inO = new int[i];
for (int j = 0; j < i; j++) {
// 把左子树的先序遍历找出来
preO[j] = pre[j + 1];
}
for (int j = 0; j < i; j++) {
// 把左子树的中序遍历找出来
inO[j] = in[j];
}
root.left = reConstructBinaryTree(preO, inO);
}else {
root.left = null;
}
int length = pre.length;
if (length - i - 1 > 0) {
int[] preO = new int[length - i - 1];
int[] inO = new int[length - i - 1];
for (int j = i + 1; j < length; j++) {
preO[j - i - 1] = pre[j];
inO[j - i - 1] = in[j];
}
root.right = reConstructBinaryTree(preO, inO);
} else {
root.right = null;
}
return root;
}
}