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.

For example, you may serialize the following tree

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ 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.

Thoughts:

Serialization/Deserialization: Choose an order traversal and implement it.

/**
 * 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 {

   // preorder implementaion 
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ostringstream os; // altervatively, stringstream os;
        serialize(root, os);
        return os.str();
    }

    void serialize(TreeNode * root, ostringstream & os){
        if(root){

            os<< root->val << ' '; // altervatively, os<< root->val << ",";
            serialize(root->left, os);
            serialize(root->right, os);
        }
        else{
            os << "# "; //stop token // altervatively, stringstream os << "#,";
        }
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data); 
        return deserialize(in);    
    }

    TreeNode* deserialize(istringstream& in){
        string val;
        in >> val;                    // if serialize data as "," separated, do: getline(in, val, ",");
        if(val == "#") return nullptr;

        TreeNode * root = new TreeNode(stoi(val));
        //preorder traversal
        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));

Credits:
Special thanks to@Louis1992 for adding this problem and creating all test cases. Special thanks to @StefanPochmann and zhang lei in 水中的鱼 for adding the solution for this problem!

results matching ""

    No results matching ""