剑指Offer-序列化二叉树

题目描述 [序列化二叉树]

请实现两个函数,分别用来序列化和反序列化二叉树

解题思路

参考

  • 借助string类型的变量来拼接序列化的字符串。只需前序遍历二叉树,当遇到根节点为空时,追加 ‘#’,并退出递归,否则追加二叉树的根节点值,接着追加逗号。接下只需递归实现左子树和右子树的序列化。那么,序列化之后得到了string类型的字符串.最后string转str*即可。
  • 进行反序列化时,如果遇到 ‘#’ ,那么指针移动一个单位,退出递归。否则,找到字符数组中的一个二叉树节点值,然后构造根节点,如果此时字符串为空,直接返回根节点,否则指针继续移动一个单位。接下来根节点的左右指针分别连接左子树的递归实现结果和右子树的递归实现结果

代码

class Solution {
public:
    char* Serialize(TreeNode *root) {
        if(!root) return NULL;
        string s="";
        Serialize(root, s);
        char *res = new char[s.size()+1];
        strcpy(res, s.c_str());
        return res;
    }

    TreeNode* Deserialize(char *str) {
        if(str==NULL) return NULL;
        string s(str);
        return Deserialize(s);
    }

    void Serialize(TreeNode *root, string &s){
        if(!root){
            s.push_back('#');
            s.push_back(',');
            return ;
        }
        s += to_string(root->val);
        s.push_back(',');
        Serialize(root->left, s);
        Serialize(root->right, s);
    }
    TreeNode* Deserialize(string &s){
        if(s.empty()) return NULL;
        if(s[0]=='#'){
            s = s.substr(2);
            return NULL;
        }
        TreeNode *root = new TreeNode(stoi(s));
        s = s.substr(s.find_first_of(',') + 1);
        root->left = Deserialize(s);
        root->right = Deserialize(s);
        return root;
    }
};

你可能感兴趣的:(剑指Offer-序列化二叉树)