Leetcode 297. 二叉树的序列化和反序列化(困难)


题目:

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 * * 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / * 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 * * 提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode * 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。   示例 1: * 输入:root = [1,2,3,null,null,4,5] * 输出:[1,2,3,null,null,4,5]   * 示例 2: * 输入:root = [] * 输出:[]   * 示例 3: * 输入:root = [1] * 输出:[1]   * 示例 4: * 输入:root = [1,2] * 输出:[1,2]   思路: labuladong c++中,stringstream可以用来自动转换或分隔字符串,其中默认分隔符包括空格、tab、回车换行 这里我们用空格来表示结点分隔,用#表示空结点,使用前序遍历来序列化和反序列化。 这样就可以顺序对字符串进行拆解和还原  
class Codec {
public:

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

    void serialize(TreeNode* root, ostringstream &in){
        if(root==nullptr){
            in << "#"<<" ";
            return;
        }
        in << root->val <<" ";
        serialize(root->left,in); 
        serialize(root->right,in); 
    }

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

    TreeNode* deserialize(istringstream& out){
        string str;
        out >> str;
        if(str=="#"){
            return nullptr;
        }
        TreeNode* root=new TreeNode(stoi(str));
        root->left=deserialize(out);
        root->right=deserialize(out);
        return root;
    }
};