劍指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:
    void serialize(TreeNode *root,string &str)
    {
        if(!root)
        {
            str+="#!";
            return;
        }
        str+=to_string(root->val)+"!";
        serialize(root->left, str);
        serialize(root->right, str);
    }
    char* Serialize(TreeNode *root) {    
        if(!root)
            return nullptr;
        string save;
        serialize(root,save);
        char* result=new char[save.size()+1];
        strcpy(result, save.c_str());
        return result;
    }
    TreeNode* deserialize(char** str)
    {
        if(**str=='#')
        {
            (*str)+=2;
            return nullptr;
        }
        int val=0;
        while(**str!='!'&&**str!='\0')
        {
            val=val*10+(**str-'0');
            ++(*str);
        }
        
        TreeNode* pNode=new TreeNode(val);
        if(**str=='\0')
            return pNode;
        else
            ++(*str);
        pNode->left=deserialize(str);
        pNode->right=deserialize(str);
        return pNode;
    }
    TreeNode* Deserialize(char *str) {
        if(str==nullptr)
            return nullptr;
        return deserialize(&str);
    }
};

複雜度分析:時間複雜度爲O(N),空間複雜度爲O(1).

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