1. 程式人生 > 資訊 >2020 諾貝爾生理學或醫學獎揭曉:三人發現丙型肝炎病毒

2020 諾貝爾生理學或醫學獎揭曉:三人發現丙型肝炎病毒

劍指 Offer 07. 重建二叉樹

遞迴1

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
    {
        if(preorder.size()==0)
            return NULL;
        if(preorder.size()==1)
        {
            TreeNode* root=new TreeNode(preorder[0]);
            return root;
        }

        TreeNode* root=new TreeNode(preorder[0]);
        int index;
        for(int i=0;i<inorder.size();i++)
        {
            if(inorder[i]==preorder[0])
            {
                index=i;
                break;
            }
        }
        vector<int> leftPre(preorder.begin()+1,preorder.begin()+1+index);
        vector<int> leftIn(inorder.begin(),inorder.begin()+index);
        vector<int> rightPre(preorder.begin()+1+index,preorder.end());
        vector<int> rightIn(inorder.begin()+index+1,inorder.end());

        root->left=buildTree(leftPre,leftIn);
        root->right=buildTree(rightPre,rightIn);
        return root;
    }

};

改進:遞迴2

不直接輸入vector進行遞迴,而是通過索引進行遞迴

class Solution {
public:
    map<int,int> dic;
    vector<int> preOrder;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
    {
        for(int i=0;i<inorder.size();i++)
        {
            dic[inorder[i]]=i;
        }
        for(int i=0;i<preorder.size();i++)
        {
            preOrder.push_back(preorder[i]);
        }

        return recur(0,0,inorder.size()-1);
    }

    TreeNode* recur(int pre_root,int in_left,int in_right)
    {
        if(in_left>in_right)
            return NULL;
        TreeNode* root= new TreeNode(preOrder[pre_root]);
        int index=dic[preOrder[pre_root]];
        root->left=recur(pre_root+1,in_left,index-1);
        root->right=recur(pre_root+1+index-in_left,1+index,in_right);
        return root;
    }

};