/**
* 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 pre_idx=0; //构造二叉树时,顺序从前序遍历中取值构造结点,当前构造到的下标
map<int,int> mp; //储存中序遍历的值和位置,用于查找根节点,通过下标将中序遍历分成左右两部分
vector<int> pre; //顺序选取前序遍历中的值来构造树
TreeNode* helper(int in_left,int in_right){
if(in_left==in_right) //结束递归的条件:没有元素来构造树
return NULL;
TreeNode* root=new TreeNode(pre[pre_idx]); //选取前序遍历中的值来构造结点
auto iter=mp.find(pre[pre_idx]); //寻找该结点在中序遍历中的位置
int mid = iter->second; //根将中序遍历分成左右两部分
pre_idx++; //前序遍历的下标要向后移动到下一个要生成元素的下标
//递归生成左右子树,注意先生成左子树再生成右子树
root->left=helper(in_left,mid); //注意是[ )
root->right=helper(mid+1,in_right);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
pre=preorder; //复制一份前序遍历,用来顺序选取构造结点,给递归函数使用
for(int i=0;i<inorder.size();i++) //构造map,储存中序遍历的值和位置
mp[inorder[i]]=i;
return helper(0,inorder.size()); //构造二叉树
}
};
105. 从前序与中序遍历序列构造二叉树
最新推荐文章于 2024-08-24 11:23:15 发布