题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
观察前序遍历的第一位是树的根节点,在中序遍历的结果中找到前序遍历的第一位,得出index。在中序遍历[0:index]为树根节点的左子树,[index:length]为右子树。左子树和右子树根据同样的特征递归进行构建。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root = new TreeNode(pre[0]);
int len = pre.length;
if(len==1){
root.left = null;
root.right = null;
return root;
}
int firstindex = 0;
int i = 0;
for(i=0;i<len;i++){
if(in[i]==pre[0])
{
firstindex = i;
break;
}
}
if(firstindex > 0) {
int npre[] = new int[firstindex];
int nin[] = new int[firstindex];
for(i=0;i<firstindex;i++) {
npre[i] = pre[i+1];
nin[i] = in[i];
}
root.left = reConstructBinaryTree(npre,nin);
}else {
root.left = null;
}
if(len-firstindex-1>0) {
int npre[] = new int[len-firstindex-1];
int nin[] = new int[len-firstindex-1];
for(i=0;i<(len-firstindex-1);i++) {
npre[i] = pre[i+1+firstindex];
nin[i] = in[i+1+firstindex];
}
root.right = reConstructBinaryTree(npre,nin);
}
else {
root.right = null;
}
return root;
}
}