序列化二叉树

来源:互联网 发布:基尼系数统计学算法 编辑:程序博客网 时间:2024/05/25 21:34

题目描述

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


分析: 1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。
 2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树。

/*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==NULL) return NULL;        string str="";        Serializestr(root,str);            //用string来存储先序遍历的二叉树序列        char *res=new char[str.size()+1];        for(int i=0; i<str.size(); ++i)            res[i]=str[i];                 //将string字符串赋值给char*        res[str.size()]='\0';        return res;    }        void Serializestr(TreeNode* root, string &str)  //保存每次递归时的str值        {        if(root==NULL)            {            str+="#,";     //到达根节点或叶子结点时,添加一个#表示接在叶子结点后的空指针NULL            return;        }        str+=to_string(root->val)+",";        Serializestr(root->left,str);    // 遍历左子树        Serializestr(root->right,str);    //遍历右子树    }        TreeNode* Deserialize(char *str) {        if(str==NULL||str[0]=='\0') return NULL;        int num=0;        return Deserializenum(str,num);  //递归过程需要记录遍历到哪个位置            }        TreeNode* Deserializenum(char* str,int &num)        {        int val=0;        if(str[num]=='#')            {            num+=2;            return NULL;        }        while(str[num]!=','&&str[num]!='\0')  //逗号分隔各个节点的值            {            val=val*10+str[num]-'0';      //将各个节点的字符串转换成整数            ++num;        }        ++num;        TreeNode* root=new TreeNode(val);  //创建二叉树的各个节点        root->left=Deserializenum(str,num);        root->right=Deserializenum(str,num);        return root;    }};





原创粉丝点击