行业资讯 2025年08月6日
0 收藏 0 点赞 503 浏览 1737 个字
摘要 :

在搞二叉树序列化和反序列化这活儿的时候,C++和Java比起来,就少了个像Java字符串split那样能直接分割字符串的函数,属实有点不方便。不过别慌,咱用流的思路,也能模拟……

在搞二叉树序列化和反序列化这活儿的时候,C++和Java比起来,就少了个像Java字符串split那样能直接分割字符串的函数,属实有点不方便。不过别慌,咱用流的思路,也能模拟出这个功能。实现这个功能,主要得用到<sstream><string>这俩头文件。

<string>里的getline函数挺好用的,它不仅能读取整行输入,还有个构造函数,能从流里按你指定的任意字符把内容分割成一个个小片段(token)。std::istream &std::getline<char, std::char_traits<char>, std::allocator<char>>(std::istream &Istr, std::string &_Str, char _Delim),这个函数还有4个重载,要是想深入了解,可以去搜索一下。

<sstream>里的istringstream也很关键,它能把字符串包装成输入流。就像这样:

istringstream stream(str); // 将字符串包装为输入流

有了这俩“神器”,咱们就能动手实现类似Javasplit的功能啦,代码如下:

class serializationAndDeserialiation {
public:
    class Node {
    public:
        int value;
        Node* left;
        Node* right;

        Node(int data) : value(data), left(nullptr), right(nullptr) {};
    };

    // 前序遍历序列化二叉树
    string serialByPre(Node* head) {
        if (head == nullptr) {
            return \"#_\";
        }
        string res = to_string(head->value) + \"_\";
        res += serialByPre(head->left);
        res += serialByPre(head->right);
        return res;
    }

    // 前序遍历反序列化二叉树,这里用到了模拟的split功能
    Node* deserialByPre(string prestr) {
        // C++实现split
        vector<string> tokens;
        istringstream stream(prestr); // 将字符串包装为输入流
        string token;

        // 按分隔符\'_\'读取
        while (getline(stream, token, \'_\')) {
            tokens.push_back(token);
        }
        return deserialPre(tokens);
    }

    // 辅助反序列化的递归函数
    Node* deserialPre(vector<string>tokens) {
        if (tokens.empty()) {
            return nullptr;
        }
        string value = tokens.front();
        tokens.erase(tokens.begin());
        if (value == \"#\") {
            return nullptr;
        }
        // 注意这里用new动态分配内存创建节点
        Node* head = new Node(stoi(value));
        head->left = deserialPre(tokens);
        head->right = deserialPre(tokens);
        return head;
    }
};

代码里的serialByPre函数,是用前序遍历的方式序列化二叉树,要是节点为空,就返回\"#_\";不为空的话,就把节点值转成字符串,再加上\"_\",然后递归处理左子树和右子树。

deserialByPre函数则是负责反序列化。先把输入的字符串包装成输入流,再用getline\"_\"把字符串分割开,存到tokens这个vector里,最后调用deserialPre进行递归反序列化。

deserialPre函数是反序列化的核心递归函数,它从tokens里取出节点值,要是值为\"#\"或者tokens为空,就返回nullptr;否则就创建新节点,继续递归构建左右子树。

总之,通过<sstream><string>头文件里的函数,咱们成功在C++里模拟出了Java的字符串分割功能,还把它应用到了二叉树序列化和反序列化里,以后遇到类似需求,就知道咋整啦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10348.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号