重建二叉树

138 阅读1分钟

image.png 题目链接:www.nowcoder.com/practice/8a…

还是要告诉自己,多写例子,多想
class Solution {
    public:
    unordered_map<int, int> index;
    TreeNode* buildTree(vector<int>pre,vector<int>vin,int sub)
    {
        if(pre.empty()) return nullptr;
        if(pre.size() == 1) return (new TreeNode(pre[0]));

        int rootVal = pre[0];
        TreeNode *rootNode = new TreeNode(rootVal);
        int pos = index[rootVal]-sub;


        int leftSize = pos, rightSize = vin.size()-pos-1;
        //创建左右子树,时间复杂度为1
        vector<int> leftPre(pre.begin()+1,pre.begin()+1+leftSize);
        vector<int> rightPre(pre.begin()+1+leftSize,pre.end());
        vector<int> leftVin(vin.begin(),vin.begin()+leftSize);
        vector<int> rightVin(vin.begin()+leftSize+1,vin.end());

        rootNode->left = buildTree(leftPre, leftVin, sub);
        rootNode->right = buildTree(rightPre, rightVin, sub+leftSize+1);
        return rootNode;
    }
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //采用了分治的方法
        index.clear();
        for(int i=0;i<vin.size();i++) index[vin[i]] = i;
        return buildTree(pre, vin,0);
    }
};