劍指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;  
    }
    */
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章