LeetCode 105. 从前序与中序遍历序列构造二叉树
思路:
对于一个前序遍历,第一个元素是根节点,而在中序遍历中,根节点的前面是左子树的成员,右侧是右子树的成员,所以我们只要实现一个递归即可,找好两种遍历中左子树的区间以及右子树的区间,然后建立一个数返回即可。
代码:
/**
* 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> pos;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//二叉树的遍历 必须有中序遍历和其他两种遍历任意一个才能推出原二叉树
//还是递归 先找到根节点
//pos存的是中序遍历中点的下标
for(int i=0;i<preorder.size();i++) pos[inorder[i]] = i;
return build(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
}
TreeNode* build(vector<int> &preorder,vector<int> &inorder,int pl,int pr,int il,int ir){
if(pl > pr) return NULL;
auto root = new TreeNode(preorder[pl]);
int k=pos[preorder[pl]];
root->left = build(preorder , inorder , pl+1 , pl+k-il , il , k-1);
root->right = build(preorder , inorder , pl+k-il+1 , pr , k+1 , ir);
return root;
}
};
评论区