思路:数据结构中的分治思想,更具前序和中序递归构造二叉树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<int,int> index;
//构造二叉树
TreeNode* build(const vector<int>& preorder,const vector<int>& inorder,int prelef,int prerig,int inlef,int inrig){
if(prelef>prerig)return nullptr;//结束
int preroot = prelef;//先序遍历中的位置
int inroot = index[preorder[preroot]];//中序遍历的位置
TreeNode* root = new TreeNode(preorder[preroot]);//构造根
int left_subtree_size = inroot-inlef;//记录分治的左子树长度,简化理解难度
root->left = build(preorder,inorder,prelef+1,prelef+left_subtree_size,inlef,inroot-1);//递归构造左子树
root->right = build(preorder,inorder,prelef+left_subtree_size+1,prerig,inroot+1,inrig);//递归构造右子树
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int cnt = inorder.size();//数组长度
for(int i=0;i<cnt;i++){//存入集合中
index[inorder[i]] = i;
}
return build(preorder,inorder,0,cnt-1,0,cnt-1);
}
};