有了前序和中序的经验,后序的好写很多,直接反过来,从右结点开始构建即可
class Solution {
public:
TreeNode *build(vector<int>& postorder,int& pmove,int inl,int inr,unordered_map<int,int>& rec)
{
if(inr<=inl)
return nullptr;
TreeNode *root=new TreeNode(postorder[pmove--]);
int i=rec.find(root->val)->second;
root->right=build(postorder,pmove,i+1,inr,rec);
root->left=build(postorder,pmove,inl,i,rec);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size()==0)
return nullptr;
unordered_map<int,int> rec;
int pmove=0;
for(;pmove<inorder.size();pmove++)
rec[inorder[pmove]]=pmove;
return build(postorder,--pmove,0,postorder.size(),rec);
}
};