297. Serialize and Deserialize B

2018-08-19  本文已影响0人  刘小小gogo
image.png

解法一:先序遍历
注意其中的ostringstream 和 istringstream 的用法,
字符串转int stoi

// Recursion
class Codec {
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ostringstream out;
        serialize(root, out);
        return out.str();
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data);
        return deserialize(in);
    }
private:
    void serialize(TreeNode *root, ostringstream &out) {
        if (root) {
            out << root->val << ' ';
            serialize(root->left, out);
            serialize(root->right, out);
        } else {
            out << "# ";
        }
    }
    TreeNode* deserialize(istringstream &in) {
        string val;
        in >> val;
        if (val == "#") return nullptr;
        TreeNode *root = new TreeNode(stoi(val));
        root->left = deserialize(in);
        root->right = deserialize(in);
        return root;
    }
};

解法二:利用队列,层次遍历
注意 int->string 用to_string
string -> int 用stoi

/**
 * 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) {
        queue<TreeNode*> q;
        q.push(root);
        string ans = "";
        while(!q.empty()){
            TreeNode* cur = q.front();
            q.pop();
            if(cur != NULL){
                ans += to_string(cur->val) + " ";
                q.push(cur->left);
                q.push(cur->right);
            }
            else{
                ans += "NULL ";//这里必须要有空格!!!!!
            }
        }
        return ans;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data);
        vector<TreeNode*> nodes;
        string tmp;
        while(in>>tmp){
            if(tmp != "NULL"){
                nodes.push_back(new TreeNode(stoi(tmp)));
            }
            else{
                nodes.push_back(NULL);
            }
        }
        int pos = 0, offset = 1;
        while(offset < nodes.size()){
            if(nodes[pos] != NULL){
                nodes[pos]->left = nodes[offset++];
                if(offset < nodes.size()) nodes[pos]->right = nodes[offset++];
            }
            pos += 1;
        }
        return nodes[0];
    }
};

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

猜你喜欢

热点阅读