The most important thing is to find the correct index.
void build(vector<int>& postorder, vector<int>& inorder, int index, int begin, int end, TreeNode*& root) {
if(begin >= end) return;
int n = postorder.size();
int val = postorder[index];
root = new TreeNode(val);
int i = 0;
while(i < n && inorder[i] != val) {i++;}
if(i > 0) build(postorder, inorder, i + index - end, begin, i, root->left);
if(i < n - 1) build(postorder, inorder, index - 1, i + 1, end, root->right);
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
TreeNode* root = NULL;
build(postorder, inorder, postorder.size() - 1, 0, postorder.size(), root);
return root;
}