1. 程式人生 > >Leetcode: 449.二叉搜尋樹的序列化和反序列化

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

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

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

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

注意:不要使用類成員/全域性/靜態變數來儲存狀態。 你的序列化和反序列化演算法應該是無狀態的。

解題思路:

層次遍歷,數字和字串的相互轉化。利用層次遍歷獲取二叉樹對應的字串,然後利用層次遍歷的思想將字串轉換成二叉樹。

注意事項:

  • 二叉樹中可能有0或者負值,0與NULL轉換成int的值是一樣的,為了避免識別上的困難,將每一個val用[]括起來,比如,[NULL],[0],構建二叉樹時,先不要急著轉int,先判斷是數字字串還是NULL,避免出錯。
  • 本題採用了字串流,對字串轉int以及int轉字串等操作,由於轉換次數過多,存在較多的clear操作,個人認為這是導致不能擊敗100%的原因。執行時間達到20ms,與100%的程式碼16ms相差4ms。

C++
class Codec {
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        stringstream ss;
        queue<TreeNode*> Q;
        Q.push(root);
        TreeNode* temp;
        string res,sub;
        while (!Q.empty()) {        
            temp = Q.front();
            if (!temp) { res += "[NULL]"; }
            else {
                ss.clear();
                ss << temp->val;
                ss >> sub;
                sub = "[" + sub + "]";
                res += sub;
                Q.push(temp->left);
                Q.push(temp->right);
            }
            Q.pop();
        }
        return res;
    } 
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        vector<string> Data;
        int size = data.size(),i;
        for (i = 1; i <= size; i++) {
            if (data[i - 1] == '[') Data.push_back(""); 
            else if (data[i - 1] == ']') {}
            else {
                Data.back().push_back(data[i - 1]);
            }
        }
        if (Data[0] == "NULL") return NULL;
        stringstream ss;
        int pos = 1;
        queue<TreeNode*> Q;
        TreeNode* root = new TreeNode(0);
        ss << Data[0];
        ss >> root->val;
        Q.push(root);
        TreeNode* temp;
        while (!Q.empty()) {            
            temp = Q.front();            
            if (Data[pos] == "NULL") { 
                temp->left = NULL;
            }
            else {
                ss.clear();
                temp->left = new TreeNode(0);
                ss << Data[pos];
                ss >> temp->left->val;
                Q.push(temp->left);
            }
            if (Data[pos + 1] == "NULL") {
                temp->right = NULL;
            }
            else {
                ss.clear();
                temp->right= new TreeNode(0);
                ss << Data[pos + 1];
                ss >> temp->right->val;
                Q.push(temp->right);
            }
            Q.pop();
            pos += 2;
        }
        return root;
    }
};