博客
关于我
剑指offer Leetcode 37.序列化二叉树
阅读量:313 次
发布时间:2019-03-03

本文共 1996 字,大约阅读时间需要 6 分钟。

序列化和反序列化是将树结构转换为字符串或其他数据结构的过程,常用于数据持久化或传输。以下是优化后的代码和解释:

序列化(Level Order Traversal)

思想:

逐层写入树节点的值,使用队列来维护当前处理的节点层次。每次从队列中取出当前节点,记录其值,然后将左、右子节点加入队列,继续处理。空节点记录为“NULL”。

复杂度:

  • 时间:O(n),遍历每个节点一次。
  • 空间:O(n),用于存储队列中的节点。

代码:

#include 
#include
#include
using namespace std;string serialize(TreeNode* root) { queue
my_queue; my_queue.push(root); string str_tree; while (!my_queue.empty()) { TreeNode* cur = my_queue.front(); my_queue.pop(); if (cur != NULL) { str_tree += to_string(cur->val) + " "; my_queue.push(cur->left); my_queue.push(cur->right); } else { str_tree += "NULL "; } } return str_tree;}

反序列化

思想:

将字符串拆分成单个节点值,并重建树结构。使用流来逐个读取字符,构建节点值列表。然后根据列表顺序重建树,连接左、右子节点。

复杂度:

  • 时间:O(n),处理字符串并构建节点列表。
  • 空间:O(n),用于存储节点值和树结构。

代码:

#include 
#include
#include
#include
using namespace std;TreeNode* deserialize(string data) { if (data.empty()) { return NULL; } istringstream input(data); string str_cur; vector
vec_node; while (input >> str_cur) { if (str_cur == "NULL") { vec_node.push_back(NULL); } else { vec_node.push_back(new TreeNode(stoi(str_cur))); } } for (int i = 0, j = 1; j < vec_node.size(); ++i) { if (vec_node[i] == NULL) { continue; } vec_node[i]->left = vec_node[j++]; if (j < vec_node.size()) { vec_node[i]->right = vec_node[j++]; } } return vec_node[0];}

使用流优化

注意:

  • 使用ostringstreamistringstream来提高效率,避免频繁的字符串拼接。
  • 反序列化时,使用空格分隔单个节点值,确保读取正确。

优化说明

  • 序列化:

    • 使用ostringstream替代string+操作,提升拼接效率。
    • 逐层处理节点,确保树结构层序正确。
  • 反序列化:

    • 使用流处理字符串,提高字符读取效率。
    • 逐个构建节点值列表,确保正确连接左、右子节点。
  • 代码结构:

    • 函数参数和数据结构清晰,易于理解和维护。
    • 适当使用vectorqueue等数据结构,优化空间复杂度。
  • 可逆性:

    • 序列化后的字符串可用于反序列化,确保数据一致性。
    • 处理多余空节点,避免结构错误。
  • 通过以上优化,代码结构清晰,效率提升,适用于大规模数据序列化和反序列化任务。

    转载地址:http://mndq.baihongyu.com/

    你可能感兴趣的文章
    OSG中找到特定节点的方法(转)
    查看>>
    OSG学习:C#调用非托管C++方法——C++/CLI
    查看>>
    OSG学习:人机交互——普通键盘事件:着火的飞机
    查看>>
    OSG学习:几何体的操作(一)——交互事件、简化几何体
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(一)——四边形
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>