class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return buildTreeProcess(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
TreeNode* buildTreeProcess(vector<int>& inorder, int iStart, int iEnd, vector<int>& postorder, int pStart, int pEnd) {
if(iStart > iEnd || pStart > pEnd) return nullptr;
int i = 0;
for(i = iStart; i < iEnd; i++) {
if(inorder[i] == postorder[pEnd])
break;
}
int leftSize = i - iStart;
int rightSize = iEnd - i;
TreeNode *cur = new TreeNode(postorder[pEnd]);
cur->left = buildTreeProcess(inorder, iStart, iStart + leftSize - 1, postorder, pStart, pStart + leftSize - 1);
cur->right = buildTreeProcess(inorder, i + 1, iEnd, postorder, pEnd - rightSize, pEnd - 1);
return cur;
}
};