297. Serialize and Deserialize Binary Tree

问题描述:

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

Example: 

You may serialize the following tree:

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]"

Clarification: The above format is the same as how LeetCode serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.

 

解题思路:

参考了Grandyang的解法

需要注意的是istringstream以‘ ’为间断

所以在输入的时候,后面一定要加' '

 

代码:

/**
 * 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) {
        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;
    }
};

// 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) {}
 * };
 */
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string ret = "";
        if(!root) return "*";
        queue<TreeNode*> nodeQ;
        nodeQ.push(root);
        while(!nodeQ.empty()){
            TreeNode* curNode = nodeQ.front();
            nodeQ.pop();
            if(curNode){
                ret.append(to_string(curNode->val));
                nodeQ.push(curNode->left);
                nodeQ.push(curNode->right);
            }else{
                ret.append("*");
            }
            ret.append("_");
        }
        std::cout << ret << std::endl;
        return ret;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if(data == "*" || data.empty()) return NULL;
        int start = 0;
        TreeNode* root;
        queue<TreeNode*> nodeQ;
        int assignedChild = 0;
        while(start < data.size()){
            int end = data.find("_", start);
            string nodeV = data.substr(start, end-start);
            start = end+1;
            if(nodeQ.empty()){
                int v = atoi(nodeV.c_str());
                TreeNode* n = new TreeNode(v);
                root = n;
                nodeQ.push(n);
            }else{
                TreeNode* pNode = nodeQ.front();
                //std::cout << pNode->val << " : " << nodeV << std::endl;
                if(!pNode) continue;
                if(nodeV != "*"){
                    int v = atoi(nodeV.c_str());
                    TreeNode* child = new TreeNode(v); 
                    nodeQ.push(child);
                    if(assignedChild == 0){
                        pNode->left = child;
                    }else{
                        pNode->right = child;
                    }
                }
                ++assignedChild;
                assignedChild %= 2;
                if(assignedChild == 0){
                    nodeQ.pop();
                }
            }
        }
        
        return root;
    }
};

 

posted @ 2018-06-13 14:16  妖域大都督  阅读(123)  评论(0编辑  收藏  举报