1 public class Solution {
2 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
3
4 TreeNode root = helper(pre,in,0,pre.length - 1,0,in.length - 1);
5
6 return root;
7 }
8
9 public TreeNode helper(int[] pre,int[] in,int startPreorder,int endPreorder,int startInorder,int endInorder){
10
11 if(startPreorder > endPreorder || startInorder > endInorder)
12 return null;
13
14
15 //前序遍历序列的第一个数字是根节点的值
16 TreeNode root = new TreeNode(pre[startPreorder]);
17
18
19 //在中序遍历中找到根节点的值
20 int rootInorder = startInorder;
21 for(;rootInorder <= endInorder;rootInorder++){
22
23 if(in[rootInorder] == pre[startPreorder]){
24 break;
25 }
26 }
27 int offset = rootInorder - startInorder;
28 int leftPreorderEnd = startPreorder + offset;
29
30 if(offset > 0){
31
32 root.left = helper(pre,in,startPreorder + 1,leftPreorderEnd,startInorder,rootInorder - 1);
33 }
34
35 if(offset < endPreorder - startPreorder){
36 root.right = helper(pre,in,leftPreorderEnd + 1,endPreorder,rootInorder + 1,endInorder);
37
38 }
39 return root;
40
41 }
42
43 }