1. 程式人生 > 遊戲 >索尼或將為PS5手柄增加PC韌體更新支援

索尼或將為PS5手柄增加PC韌體更新支援

449. 序列化和反序列化二叉搜尋樹

序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。

設計一個演算法來序列化和反序列化 二叉搜尋樹 。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。

編碼的字串應儘可能緊湊。

示例 1:

輸入:root = [2,1,3]
輸出:[2,1,3]

示例 2:

輸入:root = []
輸出:[]

提示:

  • 樹中節點數範圍是 [0, 104]
  • 0 <= Node.val <= 104
  • 題目資料 保證 輸入的樹是一棵二叉搜尋樹。

思路:

​ 本題類似於二叉樹的序列化與反序列化,對於BST來說,他的前序遍歷第一個數是根節點。在序列化時,利用分隔符將所有資料都存入string中。在反序列化時,先將資料分開來存進容器裡,在去在[min,max]閉區間中去構造BST,左節點都比根節點小,右節點都比根節點大

class Codec {
public:
    string a="";
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        //前序遍歷
        if(root==NULL)return a;
        //用,分隔開每個數
        a+=to_string(root->val)+',';
        serialize(root->left);
        serialize(root->right);
        return a;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        //cout<<data;
        //反序列化
        //先將每個節點的數取出來
        vector<string>nodes;
        int n=data.size();
        string s="";
        for(int i=0;i<n;i++){  
            //每遇到, 就記入一個數據
            if(data[i]==','){
                nodes.push_back(s);
                s="";
            }else{
                s+=data[i];
                //cout<<s<<endl;
            }
        }
        return deserialize(nodes,INT_MIN,INT_MAX);
    }
    //利用nodes容器,在[min,max]中構造一個BST
    TreeNode* deserialize(vector<string>&nodes,int min,int max){
        if(nodes.empty())return NULL;
        //利用前序遍歷進行反序列化
        //容器的第一個元素就是根節點
        int rootVal=stoi(nodes.front());
        if (rootVal > max || rootVal < min) {
            // 超過閉區間 [min, max],則返回空指標
            return NULL;
        }
        TreeNode* root=new TreeNode(rootVal);
        nodes.erase(nodes.begin());
        //遞迴 構造左右子樹 BST左子樹小於根節點 右子樹大於根節點
        root->left=deserialize(nodes,min,rootVal);
        root->right=deserialize(nodes,rootVal,max);
        return root;
    }
};

空間複雜度和時間複雜度都太高,只超過了5%。:(