剑指offer——序列化二叉树

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

剑指offer——序列化二叉树_第1张图片
序列化:得到层序序列 10,20,30,4,#,#,5,6,#,#,#,#,#,7,#,
反序列化:重建二叉树。

/*
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) {    //注意返回值为char指针,应该用char数组
        if(root==NULL) return NULL;
        string record;
        Serialize(root,record);
        char* result=new char[record.length()+1];
        unsigned int i=0;
        for(;i<record.length();i++)
            result[i]=record[i];
        result[i]='\0';
        return result;
    }
    void Serialize(TreeNode *root,string &str)
    {
        if(root==NULL)  //不存在,为空节点,输入#,然后返回
        {
            str+="#,";
            return;
        }
        str+=to_string(root->val)+','; //输入一次存在值
        Serialize(root->left,str);
        Serialize(root->right,str);
    }
    TreeNode* Deserialize(char *str) {
        if(str==NULL) return NULL;    //惯例检查是否为空
        TreeNode* new_tree=Deserialize(&str);
        return new_tree;
    }
    TreeNode* Deserialize(char **str)  //传入二级指针才能更改
    {
        if(**str=='#')
        {
            (*str)+=2;   //跳过逗号指向下一个字符
            return NULL;  //由于是空节点,不会返回实例
        }
        int num=0;
        while(**str!='\0'&&**str!=',') //将字符串转为整数
        {
            num=num*10+(**str-'0');
            (*str)++;  
        }
        TreeNode* node=new TreeNode(num); //建立新节点
        if(**str=='\0')
            return node;
        else
            (*str)++;
        node->left=Deserialize(str);
        node->right=Deserialize(str);
        return node;
    }
};

你可能感兴趣的:(笔试)