二叉树的序列化和反序列化

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

// 方法1:递归写法
// 一个思路是根据{先序遍历,中序遍历}或者{中序遍历,后续遍历}可以构造二叉树,但是重建的
// 时候有个条件:没有重复的元素。下面的递归方法一次先序遍历就可以重建出二叉树,原因是牺牲
// 了一定的存储空间,即叶子节点的两个NULL值也要保存起来,才能正常解析。
class Solution {
public:
    /**
     * This method will be invoked first, you should design your own algorithm 
     * to serialize a binary tree which denote by a root node to a string which
     * can be easily deserialized by your own "deserialize" method later.
     */
    string serialize(TreeNode * root) {
        std::ostringstream oss;
        Serialize(root, oss);
        return oss.str();
    }

    /**
     * This method will be invoked second, the argument data is what exactly
     * you serialized at method "serialize", that means the data is not given by
     * system, it's given by your own serialize method. So the format of data is
     * designed by yourself, and deserialize it here as you serialize it in 
     * "serialize" method.
     */
    TreeNode * deserialize(string &data) {
        std::istringstream iss(data);
        return Deserialize(iss);
    }

private:
    void Serialize(TreeNode* root, std::ostringstream& oss) {
        if (root == NULL) {
            oss << "# ";
            return;
        }
        oss << root->val << " ";
        Serialize(root->left, oss);
        Serialize(root->right, oss);
    }
    
    TreeNode* Deserialize(std::istringstream& iss) {
        string val;
        iss >> val;
        if (val == "#") {
            return NULL;
        }
        TreeNode* root = new TreeNode(std::stoi(val));
        root->left = Deserialize(iss);
        root->right = Deserialize(iss);
        return root;
    }
};


// 方法2:非递归写法
// 序列化和反序列化都是按层序遍历来做
class Solution {
public:
    /**
     * This method will be invoked first, you should design your own algorithm 
     * to serialize a binary tree which denote by a root node to a string which
     * can be easily deserialized by your own "deserialize" method later.
     */
    string serialize(TreeNode * root) {
        std::ostringstream oss;
        Serialize(root, oss);
        return oss.str();
    }

    /**
     * This method will be invoked second, the argument data is what exactly
     * you serialized at method "serialize", that means the data is not given by
     * system, it's given by your own serialize method. So the format of data is
     * designed by yourself, and deserialize it here as you serialize it in 
     * "serialize" method.
     */
    TreeNode * deserialize(string &data) {
        std::istringstream iss(data);
        return Deserialize(iss);
    }

private:
    void Serialize(TreeNode* root, std::ostringstream& oss) {
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* cur = q.front(); q.pop();
            if (cur == NULL) {
                oss << "# ";
            } else {
                oss << cur->val << " ";
                q.push(cur->left);
                q.push(cur->right);
            }
        }
    }
    
    TreeNode* Deserialize(std::istringstream& iss) {
        string val;
        iss >> val;
        if (val == "#") {
            return NULL;
        }
        
        TreeNode* root = new TreeNode(std::stoi(val));
        
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* cur = q.front(); q.pop();
            // create left child node
            iss >> val;
            if (val == "#") {
                cur->left = NULL;
            } else {
                TreeNode* lc = new TreeNode(std::stoi(val));
                cur->left = lc;
                q.push(lc);
            }
            // create right child node
            iss >> val;
            if (val == "#") {
                cur->right = NULL;
            } else {
                TreeNode* rc = new TreeNode(std::stoi(val));
                cur->right = rc;
                q.push(rc);
            }
        }
        return root;
    }
};
原文地址:https://www.cnblogs.com/ilovezyg/p/7593756.html