class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int postLength = postorder.size();
int inLength = inorder.size();
return buildTree(postorder,0,postLength - 1,inorder,0,inLength-1);
}
TreeNode* buildTree(vector<int>& preorder,int preStart,int preEnd, vector<int>& inorder,int inStart,int inEnd) {
if(preStart>preEnd || inStart>inEnd) return NULL;
int rootVal =preorder[preEnd];
int rootindex = inStart;
for(int i = inStart;i<=inEnd;i++){
if(rootVal == inorder[i] ){
rootindex = i;
break;
}
}
cout<<rootindex<<endl;
TreeNode *root = new TreeNode(rootVal);
int length = rootindex - inStart;
cout<<preStart+1<<preStart + length<<inStart<<rootindex - 1<<endl;
cout<<preStart + length + 1<<preEnd<<rootindex + 1<<inEnd<<endl;
root->left = buildTree(preorder,preStart,preStart+length-1,inorder,inStart,rootindex - 1);
root->right = buildTree(preorder,preStart+length,preEnd-1,inorder,rootindex + 1,inEnd);
return root;
}
};
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int postLength = postorder.size();
int inLength = inorder.size();
return buildTree(postorder,0,postLength - 1,inorder,0,inLength-1);
}
TreeNode* buildTree(vector<int>& preorder,int preStart,int preEnd, vector<int>& inorder,int inStart,int inEnd) {
if(preStart>preEnd || inStart>inEnd) return NULL;
int rootVal =preorder[preEnd];
int rootindex = inStart;
for(int i = inStart;i<=inEnd;i++){
if(rootVal == inorder[i] ){
rootindex = i;
break;
}
}
cout<<rootindex<<endl;
TreeNode *root = new TreeNode(rootVal);
int length = rootindex - inStart;
cout<<preStart+1<<preStart + length<<inStart<<rootindex - 1<<endl;
cout<<preStart + length + 1<<preEnd<<rootindex + 1<<inEnd<<endl;
root->left = buildTree(preorder,preStart,preStart+length-1,inorder,inStart,rootindex - 1);
root->right = buildTree(preorder,preStart+length,preEnd-1,inorder,rootindex + 1,inEnd);
return root;
}
};