序列化二叉树

2016-04-19  本文已影响100人  丁不想被任何狗咬

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));
上一篇下一篇

猜你喜欢

热点阅读