TreeNode* buildTreeCore(vector<int>& preorder,int prestart,int prend,vector<int>& inorder,int instart,int inend)
 {
     if(prestart>prend)
          return NULL;
     int key=preorder[prestart];
     TreeNode *root=new TreeNode(key);
     int pos=0;
     for(int i=instart;i<=inend;i++)
         if(inorder[i]==key)
         {
             pos=i;
             break;
         }
     int leftlen=pos-instart,rightlen=inend-pos;
     (*root).left=buildTreeCore(preorder,prestart+1,prestart+leftlen,inorder,instart,pos-1);
     (*root).right=buildTreeCore(preorder,prestart+leftlen+1,prend,inorder,pos+1,inend);
     return root;
 }
 void buildTreeCore(TreeNode *root, vector<int> &inorder, int inBegin, int inEnd, vector<int> &postorder, int postEnd) {
     if (postEnd < 0)
         return;
     
     root->val = postorder[postEnd];
     
     int inPartition = find(inorder, inBegin, inEnd, root->val);
     
     if (inPartition >= 0) {
         if (inBegin < inPartition) {
             root->left = new TreeNode(0);
             buildTreeCore(root->left, inorder, inBegin, inPartition - 1, postorder, postEnd - (inEnd - inPartition) - 1);
         }
         
         if (inPartition < inEnd) {
             root->right = new TreeNode(0);
             buildTreeCore(root->right, inorder, inPartition + 1, inEnd, postorder, postEnd - 1);
         }
     }
 }
 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
     if (inorder.empty() || postorder.empty())
         return NULL;
     
     if (inorder.size() != postorder.size())
         throw "The length of inorder and postorder sequences must be the same.";
         
     TreeNode *root = new TreeNode(0);
     buildTreeCore(root, inorder, 0, inorder.size() - 1, postorder, postorder.size() - 1);
     
     return root;
 }
 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
 {
     if(preorder.empty())
         return NULL;
     return buildTreeCore(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
 }