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 *buildTree(vector<int> &inorder, vector<int> &postorder) {
if (inorder.size()==0 && postorder.size()==0)
return NULL;
int pivot = postorder[postorder.size()-1];
TreeNode *root = new TreeNode(pivot);
vector<int> left_inorder;
vector<int> left_postorder;
vector<int> right_inorder;
vector<int> right_postorder;
int i = 0;
while (inorder[i]!=pivot && i<inorder.size())
{
left_inorder.push_back(inorder[i]);
left_postorder.push_back(postorder[i]);
i++;
}
for (int j=i+1; j<inorder.size(); j++)
right_inorder.push_back(inorder[j]);
for (int j=i; j<postorder.size()-1; j++)
right_postorder.push_back(postorder[j]);
root->left = buildTree(left_inorder, left_postorder);
root->right = buildTree(right_inorder, right_postorder);
return root;
}
*/
TreeNode *helper(vector<int> &inorder, int i_startIdx, int i_endIdx, vector<int> &postorder, int p_startIdx, int p_endIdx) {
if (i_endIdx<i_startIdx || p_endIdx<p_startIdx)
return NULL;
int pivot = postorder[p_endIdx];
TreeNode *root = new TreeNode(pivot);
int pivotIdx = i_startIdx;
while (inorder[pivotIdx]!=pivot && pivotIdx<=i_endIdx)
{
pivotIdx++;
}
root->left = helper(inorder, i_startIdx, pivotIdx-1, postorder, p_startIdx, p_startIdx+(pivotIdx-1-i_startIdx));
root->right = helper(inorder, pivotIdx+1, i_endIdx, postorder, p_startIdx+(pivotIdx-i_startIdx), p_endIdx-1);
return root;
}
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
if (inorder.size()==0 && postorder.size()==0)
return NULL;
return helper(inorder, 0, inorder.size()-1, postorder, 0, postorder.size()-1);
}
};