Here is a simple and easy approach with using the hash map and recursion.
/* Tree node structure
struct Node
{
int data;
struct Node* left;
struct Node* right;
Node(int x){
data = x;
left = right = NULL;
}
};*/
// Function should construct tree and return
// root of it. in[] stores inorder traversal
// post[] stores postorder traversal. n is
// size of these arrays
// int inde;
Node * Tbuild(int post[], int l, int h, unordered_map < int, int > & mp, int & inde) {
if (l > h) return NULL;
Node * root = new Node(post[inde--]);
if (l == h) return root;
int i = mp[root - > data];
root - > right = Tbuild(post, i + 1, h, mp, inde);
root - > left = Tbuild(post, l, i - 1, mp, inde);
return root;
}
Node * buildTree(int in [], int post[], int n) {
// Your code here
int inde = n - 1;
unordered_map < int, int > mp;
for (int i = 0; i < n; ++i)
mp[ in [i]] = i;
return Tbuild(post, 0, n - 1, mp, inde);
}