AcWing 18-重建二叉树

题意:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
常规的用递归方法,二叉树的遍历序列通过vector存出,这时候可以用map建立一个哈希表,方便找到根节点在中序遍历的位置从而分开左右子树。
求出左子树和右子树在序列中的区间范围,不断递归。

/**
 * 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 {
public:

    vector<int> preorder,inorder;
     map<int,int>hash;
    TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
        preorder=_preorder,inorder=_inorder;
       
        for(int i=0;i<inorder.size();i++) hash[inorder[i]]=i;
        return dfs(0,preorder.size()-1,0,inorder.size()-1);
    }
    
    TreeNode* dfs(int pl,int pr,int il,int ir)
    {
        if(pl>pr) return nullptr;
        auto root=new TreeNode(preorder[pl]);
        int k=hash[root->val];
        auto left=dfs(pl+1,pl+k-il,il,k-1);
        auto right=dfs(pl+k-il+1,pr,k+1,ir);
        
       root->left=left,root->right=right;
        
        return root;
    }
};
posted @ 2020-08-10 23:28  地球长大的赛亚人  阅读(85)  评论(0编辑  收藏  举报