https://oj.leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
递归,每次找后序的最后一个元素,然后按中序将其分为两部分即可。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int n;
vector<int> in;
vector<int> po;
TreeNode *Solve(int l1,int r1,int l2,int r2){
if(l1==r1 || l2==r2) return NULL;
int val=po[r2-1];
TreeNode *cur=new TreeNode(val);
int p=find(in.begin(),in.end(),val)-in.begin();
cur->left=Solve(l1,p,l2,l2+p-l1);
cur->right=Solve(p+1,r1,l2+p-l1,r2-1);
return cur;
}
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
in=inorder;
po=postorder;
n=in.size();
return Solve(0,n,0,n);
}
};