Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
struct Node
{
int val;
Node(int v)
{
val = v;
left = right = NULL;
}
Node *left;
Node *right;
};
Node* visit(vector<int> &postorder, int postLeft, int postRight, vector<int> &inorder, int inLeft, int inRight)
{
if (postLeft > postRight)
{
return NULL;
}
int index = inLeft;
for (;index <= inRight; index++)
{
if (inorder[index] == postorder[postRight])
{
break;
}
}
int leftLength = index - inLeft;
Node *left = visit(postorder, postLeft, postLeft+leftLength-1, inorder, inLeft, index-1);
Node *right = visit(postorder, postLeft+leftLength, postRight-1, inorder, index+1, inRight);
Node *p = new Node(postorder[postRight]);
p->left = left;
p->right = right;
return p;
}
Node* buildTree(vector<int> &postorder, vector<int> &inorder)
{
if (postorder.size() < 1)
{
return NULL;
}
return visit(postorder, 0, postorder.size()-1, inorder, 0, inorder.size()-1);
}