【剑指Offer-分解让复杂问题简单化】面试题37:序列化二叉树

题目描述

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

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

思路

可以使用先序中序(或中序后序)来保存一棵二叉树,但这种方法要求二叉树中没有重复的元素。事实上,将二叉树按先序序列保存,然后再根结点、左子树、右子树来重建即可。代码如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    char* Serialize(TreeNode *root) {    
        if(root==nullptr)
            return nullptr;
       
        string str;
        SerializeCore(root, str);
        char* ans = new char[str.length()+1];
        for(int i=0; i<str.length(); i++)
            ans[i] = str[i];
        ans[str.length()+1] = '';
        return ans;
    }
    
    void SerializeCore(TreeNode* root, string& str){
        if(root==nullptr){
            str+='#';
            str+=',';
            return;
        }
        str+=to_string(root->val);
        str+=',';
        SerializeCore(root->left, str);
        SerializeCore(root->right, str);
    }
    
    TreeNode* Deserialize(char *str) {
        if(str==nullptr)
            return nullptr;
        
        TreeNode* root = DeserializeCore(&str);
        return root;
    }
    
    TreeNode* DeserializeCore(char** str){    //因为递归过程中要在序列上移动,所以使用二级指针
        if(**str=='#'){
            (*str)+=2;    //注意这里是+2
            return nullptr;
        }
        
        int val = 0;
        while(**str!=','&&**str!=''){
            val = val*10+((**str)-'0');
            (*str)++;
        }
        TreeNode* root = new TreeNode(val);
        if(**str=='')
            return root;
        else (*str)++;
        root->left = DeserializeCore(str);
        root->right = DeserializeCore(str);
        return root;
    }
};
原文地址:https://www.cnblogs.com/flix/p/12489285.html