剑指offer---序列化二叉树

题目描述

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

二叉树序列化

               

我们以前序遍历的顺序进行序列化,对于空结点我们用一个特殊的符号‘$’来代替,则序列化后的字符串为“1 2 4 $ $ 5 $ $ 3 6 $ $ 7 $ $”

数组vector<int>:1 2 4 0xFFFFFFFF 0xFFFFFFFF 5 0xFFFFFFFF 0xFFFFFFFF 3 6 0xFFFFFFFF 0xFFFFFFFF 7 0xFFFFFFFF 0xFFFFFFFF

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    //序列化,深度优先遍历(先序遍历)
    vector<int> buf;
    void dfs1(TreeNode *root){
        if(!root) buf.push_back(0xFFFFFFFF);
        else{
            buf.push_back(root->val);
            dfs1(root->left);
            dfs1(root->right);
        }
    }
    char* Serialize(TreeNode *root){
        buf.clear();
        dfs1(root);
        int *res=new int[buf.size()];
        for(int i=0;i<buf.size();++i) res[i]=buf[i];
        return (char*)res;
    }
    TreeNode* dfs2(int * &p){
        if(*p==0xFFFFFFFF){
            p++;
            return nullptr;
        }
        TreeNode *node=new TreeNode(*p);
        p++;
        node->left=dfs2(p);
        node->right=dfs2(p);
        return node;
    }
    TreeNode* Deserialize(char *str){
        int *p=(int*)str;
        return dfs2(p);
    }
    /*
    vector<int> buf;
    //按深度优先遍历
    void dfs1(TreeNode *root) {
        if(!root) buf.push_back(0xFFFFFFFF);
        else {
            buf.push_back(root->val);
            dfs1(root->left);
            dfs1(root->right);
        }
    }
    TreeNode* dfs2(int* &p) {
        if(*p==0xFFFFFFFF) {
            p++;
            return NULL;
        }
        TreeNode* res=new TreeNode(*p);
        p++;
        res->left=dfs2(p);
        res->right=dfs2(p);
        return res;
    }
    char* Serialize(TreeNode *root) {//序列化
        buf.clear();
        dfs1(root);
        int bufSize=buf.size();
        int *res=new int[bufSize];
        for(int i=0;i<bufSize;i++) res[i]=buf[i];
        return (char*)res;
    }
    TreeNode* Deserialize(char *str) {//反序列化
        int *p=(int*)str;
        return dfs2(p);
    }
    */
    /*
    //=========================二叉树序列化==============前序遍历================
    char* Serialize(TreeNode *root) {  
        if (root == NULL)  
            return NULL;  
        string str;  
        serialize(root, str);  
        char* buffer = new char[str.size() + 1];                  
        strcpy(buffer, str.c_str());//将string类型的字符串转换成C_style类型并复制到一个char类型数组  
        return buffer;  
    }

    void serialize(TreeNode* root, string& str)  
    {  
        if (root == NULL)  
        {  
            str += "$,";//叶子结点的左右子结点为空则用 $ 来代替  
            return;  
        }  
        str += to_string(root->val);//将结点值(int)转换成字符串(string)类型  
        str += ',';  
        serialize(root->left, str);//递归序列化结点的左子树  
        serialize(root->right, str);//递归序列化结点的右子树  
    }  
  
    //========================二叉树反序列化============================
    TreeNode* Deserialize(char *str) {  
        if (str == NULL)  
            return NULL;  
        return deserialize(&str);  
    }  
  
    TreeNode* deserialize(char** str)  
    {  
        if (**str == '$')  
        {  
            (*str) += 2;  
            return NULL;  
        }  
        int val = 0;  
        while (**str != ','&&**str != '\0')//把字符串类型的数字转换成int类型的数字  
        {  
            val = val * 10 + (**str - '0');
            ++(*str);  
        }  
        TreeNode* root = new TreeNode(val);//构建根结点  
        if (**str == '\0')  
            return root;  
        else  
            ++(*str);  
        root->left = deserialize(str);//递归的构建左子树结点  
        root->right = deserialize(str);//递归的构建右子树结点  
        return root;  
    }
    */
};


猜你喜欢

转载自blog.csdn.net/qq_22238021/article/details/80640608