序列化二叉樹

https://leetcode.com/problems/serialize-and-deserialize-binary-tree/

深搜
https://leetcode.com/discuss/76182/clean-c-solution

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        if (root == nullptr) return "#";
        return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        return mydeserialize(data);
    }
    TreeNode* mydeserialize(string& data) {
        if (data[0]=='#') {
            if(data.size() > 1) data = data.substr(2);
            return nullptr;
        } else {
            TreeNode* node = new TreeNode(helper(data));
            node->left = mydeserialize(data);
            node->right = mydeserialize(data);
            return node;
        }
    }
private:
    int helper(string& data) {
        int pos = data.find(',');
        int val = stoi(data.substr(0,pos));
        data = data.substr(pos+1);
        return val;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));    

廣搜

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
 //"[1,2,3,null,null,4,5]"
 //1,2,
class Codec {
public:
    
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string ret;
        if(root == NULL) {
            return "null";
        }
        queue<TreeNode *> q;
        q.push(root);
        ret += to_string(root->val);
        while(!q.empty()) {
            TreeNode * n = q.front(); q.pop();
            if(n->left) {
                ret += "," + to_string(n->left->val);
                q.push(n->left);
            } else {
                ret+=",null";
            }
            if(n->right) {
                ret+=","+to_string(n->right->val);
                q.push(n->right);
            } else {
                ret += ",null";
            }
        }
        return ret;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        TreeNode * root;
        if(data[0]=='n'){
            return NULL;
        } else {
            root = new TreeNode(helper(data));
        }
        queue<TreeNode *> q;
        q.push(root);
        while(!q.empty()) {
            TreeNode * n = q.front();q.pop();
            if(data[0] != 'n') {
                n->left = new TreeNode(helper(data));
                q.push(n->left);
            } else {
                if(data.size() > 5)
                    data = data.substr(5);
            }
            if(data[0] != 'n'){
                n->right = new TreeNode(helper(data));
                q.push(n->right);
            } else {
                if(data.size() > 5)
                    data = data.substr(5);
            }
        }
        return root;
    }
    
    int helper(string& data) {
        int pos = data.find(',');
        int val = stoi(data.substr(0,pos));
        data = data.substr(pos+1);
        return val;
    }
};


// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,775評論 0 33
  • 請實現兩個函數,分別用來序列化和反序列化二叉樹 語言java算法分析: 我們可以采用先序遍歷的思想,只是在這里需要...
    克里斯加德納閱讀 639評論 0 50
  • 題目描述請實現兩個函數,分別用來序列化和反序列化二叉樹
    NoFacePeace閱讀 264評論 0 0
  • 早上我幫媽媽做蛋炒飯。我先炒雞蛋,再炒菜和米,最后做出了一碗香噴噴的蛋炒飯。 吃完飯我去阿姨家讀論語。我在那里讀了...
    吳沛林閱讀 451評論 0 1
  • 現在,我已經不太小時候的事了。它似乎被人從我的記憶里刪去了,所有消失了。其中的緣由我不知。 因為過節,許久未見的表...
    鏡璃閱讀 108評論 0 0