剑指Offer(牛客版)--面试题37: 序列化二叉树

博客围绕实现二叉树的序列化和反序列化展开。序列化是将每个结点按顺序转换为字符串,反序列化则是根据字符串重建二叉树,需按分隔符分割字符串数组,根据结点值重建结点对象并为左右子结点赋值,还给出了完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

分析:

序列化:也叫持久化,显然序列化需要将每个结点按照一定的顺序转换为字符串即可;

 

反序列化:根据一个字符串重新建立一棵二叉树,反序列化是序列化的逆过程,对于一个字符串,首先按照分隔符',',将其分割为字符串数组,每个字符串元素代表一个结点,然后开始重建二叉树。由于每个结点再字符串中只保留了一个val值,因此需要根据结点的值val重新构建TreeNode结点对象,并且为这个结点对象的left和right进行赋值。
 

完整代码:

 

此代码参考了一些大佬的思路,非常感谢!
/*
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 == nullptr)
            return NULL;
        //声明一个字符串用来存放节点元素的值
        string str;
        //用字符串来序列化二叉树
        serialize(root, str);
        //声明一个字符数组
        char *array = new char[str.length() + 1];
        //定义一个数组游标i
        int i;
        //将输出里面的元素转换成字符容器里
        for(i = 0; i < str.length(); i++)
        {
            array[i] = str[i];
        }
        //在array的结尾头添加'\0'结束符
        array[i] = '\0';
        //返回字符指针
        return array;
    }
    //反序列二叉树
    TreeNode* Deserialize(char *str) {
        //检查输入的合法性
        if(str == nullptr)
            return NULL;
        //声明一个节点指针
        TreeNode* pNodes = deserialize(&str);
        //返回节点指针
        return pNodes;
    }
private:
    void serialize(TreeNode *root, string &str)
    {
        //判断当前的节点是否为空
        if(root == nullptr)
        {
            //则用$,来代替节点的值
            str += '$';
            return ;
        }
        //如果当前的节点的不为空
        //将当前的节点的val转换成字符串形式
        string r = to_string(root->val);
        //向字符串str中添加节点val的字符串形式
        str += r;
        str += ',';
        //将左右子树序列化
        serialize(root->left, str);
        serialize(root->right,str);
    }
    
    TreeNode* deserialize(char **str)
    {
       //判断当前元素对应的节点是否为空
        if(**str == '$')
        {
            ++(*str);
            return NULL;
        }
        //将字符串的字符转换成整数
        int number = 0;
        while(**str != '\0' && **str != ',')
        {
            number = number * 10 + ((**str) - '0');
            ++(*str);
        }
        //声明结构体指针,并分配内存
        TreeNode *pRoot = new TreeNode(number);
        //判断数组是否为空
        if(**str == '\0')
            return pRoot;
        else
            //遍历数组
            (*str)++;
        //反序列化二叉树
        pRoot->left = deserialize(str);
        pRoot->right = deserialize(str);
        //返回根节点
        return pRoot;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值