Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
Note:
You may assume that duplicates do not exist in the tree.
vector<int> buildHashTable(vector<int> &inorder)
{
int max = inorder[0], min = inorder[0];
for (int i = 1; i < inorder.size(); i++)
{
if (max < inorder[i])
{
max = inorder[i];
}
else if (min > inorder[i])
{
min = inorder[i];
}
}
vector<int> iv(max - min + 1);
for (int i = 0; i < inorder.size(); i++)
{
iv[inorder[i] - min] = i;
}
return iv;
}
TreeNode *build(vector<int> &postorder, vector<int> &inorder, vector<int> &ht, int min,
int poststart, int postend, int instart, int inend)
{
if (poststart > postend) return NULL;
TreeNode *n = new TreeNode(postorder[postend]);
int pivot = ht[postorder[postend] - min];
n->left = build(postorder, inorder, ht, min, poststart, poststart + pivot - 1 - instart, instart, pivot - 1);
n->right = build(postorder, inorder, ht, min, postend + pivot - inend, postend - 1, pivot + 1, inend);
return n;
}
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
if (inorder.size() == 0) return NULL;
vector<int> iv = buildHashTable(inorder);
int min = inorder[0];
for (int i = 0; i < inorder.size(); i++)
{
if (min > inorder[i])
{
min = inorder[i];
}
}
return build(postorder, inorder, iv, min, 0, inorder.size() - 1, 0, inorder.size() - 1);
}