LeetCode297. 二叉树的序列化与反序列化

将二叉树先序遍历解码为一个序列字符串s,不同的数字之间用逗号分隔,如果遇到空节点,就只在s加上一个","。
如果不是空节点,就先加上当前节点的值,然后再加上逗号。

解码的时候,也是取两个逗号之间的值,如果逗号之间为空,则说明是空节点,否则new一个TreeNode出来,节点的值就是两个逗号之间的
子串的值转为int。

代码如下:

/**
 * 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:
    void encode(TreeNode* root, string &s) {
        if(root == NULL) {                                    // 空节点在序列化的时候只加上一个逗号
            s += ",";
            return ;
        }
        s += to_string(root -> val) + ",";                    // 非空节点在序列化的时候先加上节点值再加上逗号
        encode(root -> left, s);                              // 先序遍历序列化二叉树
        encode(root -> right, s);
    }

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {                  
        string s;                              
        encode(root, s);                                      // 序列化编码的结果记录在字符串s里
        return s;
    }

    TreeNode* decode(string &s, int &cur) {                   // 从字符串s反序列化二叉树,cur是当前解码的字符在字符串s中的下标,这里注意s和cur必须是引用
        if(s[cur] == ',') {                                   // 如果两个逗号之间什么也没有,说明是空节点
            ++cur;
            return NULL;
        }
        int end = cur;                                        // end记录下一个逗号的位置
        while(end < s.size() && s[end] != ',') {
            ++end;
        }
        TreeNode* root = new TreeNode(stoi(s.substr(cur, end - cur)));     // 两个逗号之间的子串的值转为int就是当前节点的值
        cur = end + 1;                                         // cur从下一个逗号的下一个位置开始解码
        root -> left = decode(s, cur);                         // 先序遍历解码字符串s
        root -> right = decode(s, cur);
        return root;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int cur = 0;                                          // 从要解码的字符串的第0个字母开始解码
        TreeNode* root = decode(data, cur);                    
        return root;
    }
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
原文地址:https://www.cnblogs.com/linrj/p/13573195.html