/**
* public class TreeNode {
* public int key;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int key) {
* this.key = key;
* }
* }
*/
public class Solution {
public TreeNode reconstruct(int[] in, int[] level) {
// Write your solution here.
if (in == null || level == null || in.length == 0 || level.length == 0 || in.length != level.length) {
return null;
}
// use map to store in order<value,index>; pair to fast locate root position
//assumption no duplicated number in the sequence
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0; i < in.length; i++) {
map.put(in[i],i);
}
return helper(in, 0, in.length - 1, level, map);
}
private TreeNode helper(int[] inorder, int inleft, int inright, int[] level, Map<Integer,Integer> map) {
//base case
if (inleft > inright) {
return null;
}
TreeNode root = new TreeNode(level[0]);
int index = map.get(root.key);
int size = index - inleft;
// in the level order sequence, index < index of root will be left subtree, other wise will be right subtree
int[] leftsub = new int[size];
int[] rightsub = new int[inright - index];
int lindex = 0;
int rindex = 0;
for (int i = 1; i < level.length; i++) {
if (map.get(level[i]) < index ) {
leftsub[lindex++] = level[i];
} else {
rightsub[rindex++] = level[i];
}
}
root.left = helper(inorder, inleft, inleft + size - 1, leftsub,map);
root.right = helper(inorder, inleft + size + 1, inright, rightsub,map);
return root;
}
}