博客
关于我
剑指offer Leetcode 37.序列化二叉树
阅读量:314 次
发布时间: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];}

使用流优化

注意:

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

优化说明

  • 序列化:

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

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

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

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

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

    你可能感兴趣的文章
    python前端之css
    查看>>
    Python制作进度条,原来有这么多方法
    查看>>
    Python制作简单的学生成绩管理系统
    查看>>
    python制作甘特图的基本知识(附Demo)
    查看>>
    python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
    查看>>
    Python到底能做什么?它的优点在哪?
    查看>>
    python利用pytorch库导出图像分割算子
    查看>>
    python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
    查看>>
    python利用excel分析过杀漏失
    查看>>
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>