/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int post_idx=post.size()-1; //逆序从后序遍历中取值构造结点,将要取值元素的下标
map<int,int> mp; //存储中序遍历的值和位置,用于查找根节点,通过下标将中序遍历分成左右两部分
vector<int> post; //逆序选取后序遍历中的值来构造结点,给递归函数调用
TreeNode* helper(int in_left,int in_right){
if(in_left == in_right) //没有元素来构造树
return NULL;
TreeNode *root=new TreeNode(post[post_idx]); //从后序遍历中选取逆序选取值来构造结点
auto mid = mp.find(post[post_idx])->second; //根节点将中序遍历分为左右两部分
post_idx--; //后序遍历的下标要向前移动到下一个要生成元素的下标
//递归生成左右子树,注意先生成右子树再生成左子树
root->right=helper(mid+1,in_right); //注意是[ ) 来构造
root->left=helper(in_left,mid);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
post=postorder; //复制一份后序遍历用来逆序选取其中的值来生成二叉树
post_idx=post.size()-1;
for(int i=0;i<inorder.size();i++) //构造map,储存中序遍历的值和位置
mp[inorder[i]]=i;
return helper(0,inorder.size()); //构造二叉树 ,注意是[ }来构造结点
}
};
11-11
11-11