【剑指Offer】面试题62:序列化二叉树

来源:互联网 发布:linux 调整根目录大小 编辑:程序博客网 时间:2024/05/23 21:07

整理自剑指Offer


一:题目描述

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


二:解题思路

序列化二叉树:选择一种遍历方式,将二叉树的遍历结果保存在字符串中

反序列化二叉树:根据生成的字符串,构造原始的树


如果二叉树的序列化是从根节点开始,那么相应反序列化的根节点的数值读出来的时候就可以开始,因此我们可以采用先序遍历的方式。

当遍历二叉树碰到NULL指针时,这些NULL指针序列化一个特殊的字符(如‘$’),另外,结点的数值之间要用一个特殊字符分开‘,’


三:代码实现

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    void SerializeCore(TreeNode *root,string &str){        if(root==NULL){            str+="$";            return ;        }                str+=to_string(root->val);        str+=",";                SerializeCore(root->left,str);        SerializeCore(root->right,str);    }    char* Serialize(TreeNode *root) {                    if(root==NULL)            return NULL;        string str;                //生成string 字符串        SerializeCore(root,str);                //将string字符串保存在char* 类型中        char* result=new char[str.length()];        int i;        for(i=0;i<str.length();i++)            result[i]=str[i];                return result;    }        TreeNode* decode(char *&str){        if(*str=='$'){            str++;//跳过‘,’            return NULL;        }                int num=0;        //将字符转化为整数        while(*str!=','){            num=num*10+((*str)-'0');            str++;        }        str++;//跳过‘,’                //创建结点        TreeNode* root=new TreeNode(num);        root->left=decode(str);        root->right=decode(str);        return root;    }        TreeNode* Deserialize(char *str) {        if(str==NULL)            return NULL;               return decode(str);            }};

原创粉丝点击