[LeetCode][LCR156]序列化与反序列化二叉树

news/2024/5/8 14:10:35

题目

LCR 156. 序列化与反序列化二叉树

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

  • 示例 1:
    在这里插入图片描述

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

  • 示例 2:

输入:root = []
输出:[]

  • 示例 3:

输入:root = [1]
输出:[1]

  • 示例 4:

输入:root = [1,2]
输出:[1,2]

  • 提示:
    树中结点数在范围 [0, 104] 内
    -1000 <= Node.val <= 1000

注意:本题与主站 297 题相同:LeetCode - Serialize and Deserialize Binary Tree

思考:

  1. 二叉树的序列化需要把记录叶子节点的作用空节点也记录下来,才能实现正确的反序列化
  2. 观察给的测试用例,其二叉树采用的就是一个序列表示,为层序遍历,故层序遍历序列化一定可以正确地反序列化
  3. 由于反序列化是从根开始构建二叉树,故根应该暴露在最前面,前序/后序遍历可以进行正确的反序列化,但是中序遍历不行,因为会存在多个不同的二叉树结构具有相同的中序遍历序列,例如,考虑以下两棵不同结构的二叉树:
    1         2/           \2             1

这两棵树具有相同的中序遍历序列(2, 1),因此仅凭中序遍历无法唯一确定二叉树的结构。

解法1:层序遍历

  1. 从序列重新构建二叉树需要先建立根,然后将其左右子树节点放入队列中,一层一层构建
class Codec {
public:// Encodes a tree to a single string.string serialize(TreeNode* root) {if(!root) return "[]";queue<TreeNode*> q;q.push(root);ostringstream oss;oss << "[";while(!q.empty()){if(q.front()){oss << q.front()->val << ",";q.push(q.front()->left);q.push(q.front()->right);} else oss << "null,";q.pop();}string str = oss.str();str.pop_back();str += "]";return str;}// Decodes your encoded data to tree.TreeNode* deserialize(string data) {if(data=="[]") return nullptr;data = data.substr(1,data.size()-2);vector<string> tokens;string token;istringstream iss(data);while(getline(iss, token, ',')){tokens.push_back(token);}TreeNode *root = new TreeNode(stoi(tokens[0]));queue<TreeNode*> q;int i=1;q.push(root);while(!q.empty()){if(tokens[i]!="null"){q.front()->left = new TreeNode(stoi(tokens[i]));q.push(q.front()->left);}++i;if(tokens[i]!="null"){q.front()->right = new TreeNode(stoi(tokens[i]));q.push(q.front()->right);}++i;q.pop();}return root;}
};

解法2:前序遍历

递归建立二叉树的核心代码:

TreeNode* node = new TreeNode(stoi(s));node->left = deserializeHelper(q);node->right = deserializeHelper(q);

完整代码:

class Codec {
public:string serialize(TreeNode* root) {if (root == nullptr) {return "#";}return to_string(root->val) + "," + serialize(root->left) + "," + serialize(root->right);}TreeNode* deserialize(string data) {queue<string> q;stringstream ss(data);string item;while (getline(ss, item, ',')) {q.push(item);}return deserializeHelper(q);}TreeNode* deserializeHelper(queue<string>& q) {string s = q.front();q.pop();if (s == "#") {return nullptr;}TreeNode* node = new TreeNode(stoi(s));node->left = deserializeHelper(q);node->right = deserializeHelper(q);return node;}
};

解法3:后序遍历

  1. 由于后序遍历为左右根,所以从根建立二叉树时需要从后往前建立,也就是根右左
  2. 从左右根取出根右左的节点顺序,可以利用栈的 LIFO 实现

class Codec {
public:string serialize(TreeNode* root) {if (root == nullptr) {return "#";}return serialize(root->left) + "," + serialize(root->right) + "," + to_string(root->val);}TreeNode* deserialize(string data) {stringstream ss(data);string item;stack<string> s;while (getline(ss, item, ',')) {s.push(item);}return deserializeHelper(s);}TreeNode* deserializeHelper(stack<string>& s) {string val = s.top();s.pop();if (val == "#") {return nullptr;}TreeNode* root = new TreeNode(stoi(val));root->right = deserializeHelper(s);root->left = deserializeHelper(s);return root;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…

Qt 图形视图 /基于Qt示例DiagramScene解读图形视图框架

文章目录 概述从帮助文档看示例程序了解程序背景/功能理清程序概要设计 分析图形视图的协同运作机制如何嵌入到普通Widget程序中&#xff1f;形状Item和文本Item的插入和删除&#xff1f;连接线Item与形状Item的如何关联&#xff1f;如何绘制ShapeItem间的箭头线&#xff1f; 下…

http协议中的强缓存与协商缓存,带图详解

此篇抽自本人之前的文章&#xff1a;http面试题整理 。 别急着跳转&#xff0c;先把缓存知识学会了~ http中的缓存分为两种&#xff1a;强缓存、协商缓存。 强缓存 响应头中的 status 是 200&#xff0c;相关字段有expires&#xff08;http1.0&#xff09;,cache-control&…

钡铼技术R40工业路由器4G WiFi一体,适用于各类工业场景

钡铼技术R40工业路由器是一款集4G网络连接和WiFi功能于一体的先进设备&#xff0c;旨在满足各类工业场景对稳定、高速网络连接的需求。作为一家致力于工业互联网解决方案的领先厂商&#xff0c;钡铼技术致力于为工业企业提供可靠的网络设备&#xff0c;以支持其数字化转型和智能…

物联网技术助力智慧城市转型升级:智能、高效、可持续

目录 一、物联网技术概述及其在智慧城市中的应用 二、物联网技术助力智慧城市转型升级的路径 1、提升城市基础设施智能化水平 2、推动公共服务智能化升级 3、促进城市治理现代化 三、物联网技术助力智慧城市转型升级的成效与展望 1、成效显著 2、展望未来 四、物联网技…

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-1、线条平滑曲面且可通过面观察柱体变化(一)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…