Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *build(vector<int>&in,int instart,int inend,vector<int>&post,int poststart,int postend)
{
if(postend<poststart||inend<instart||(postend-poststart)!=(inend-instart))
return NULL;
TreeNode *head = new TreeNode(post[postend]);
int rootpos;
for(int i=0;i<=inend-instart;i++)
if(in[i+instart]==post[postend])
{
rootpos = i;
break;
}
head->left = build(in,instart,instart+rootpos-1,post,poststart,poststart+rootpos-1);
head->right = build(in,instart+rootpos+1,inend,post,poststart+rootpos,postend-1);
return head;
}
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
int postsize = postorder.size();
int insize = inorder.size();
TreeNode *head = build(inorder,0,insize-1,postorder,0,postsize-1);
return head;
}
};