297. 二叉树的序列化与反序列化-H

2023-11-05 00:48
文章标签 二叉树 序列化 297

本文主要是介绍297. 二叉树的序列化与反序列化-H,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

297. 二叉树的序列化与反序列化-H

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

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

示例:

你可以将以下二叉树:

    1/ \2   3/ \4   5

序列化为 “[1,2,3,null,null,4,5]”
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

分析:

  1. 怎么遍历树序列化,怎么反序列化,这里用NLR递归的方式进行序列化,反序列化时,正好先解析出来的是头,接着递归两次解析到左右孩子,这样递归下去即可。从结果看效率不是最高的,因为要进行递归调用。
  2. 若按层遍历,则直接在一个循环里解决了。
  3. 注意每个元素分割符号,空节点符号,以及to_string和atoi(string.c_str());golang的strconv.Atoi()和strconv.Itoa()
/*
执行用时 :528 ms, 在所有 C++ 提交中击败了5.12%的用户
内存消耗 :715.9 MB, 在所有 C++ 提交中击败了5.27%的用户
*/
#include<iostream>
#include<stack>
#include<vector>
using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};
// Encodes a tree to a single string.
string serialize(TreeNode* root) {if(root==NULL){return "#";}return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
}
//1,2,#,#,3,4,#,#,5,#,#
TreeNode* toNode(string data,int& i){TreeNode*node=NULL;string tmp;while(i<data.size()){if(data[i]==','){node=new TreeNode(atoi(tmp.c_str()));i++;break;}else if(data[i]=='#'){//#,i+=2;return NULL;}else{tmp=tmp+data[i];i++;}}if(node==NULL)return NULL;node->left=toNode(data,i);node->right=toNode(data,i);return node;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {int idx=0;return toNode(data,idx);
}
void NLR(TreeNode*node){if(node==NULL)return;cout<<node->val<<" ";NLR(node->left);NLR(node->right);
}
int main(){TreeNode h1(1);TreeNode h2(2);TreeNode h3(3);TreeNode h4(4);TreeNode h5(5);h1.left=&h2;h1.right=&h3;h2.left=&h4;h2.right=&h5;string tmp=serialize(&h1);cout<<tmp<<endl;TreeNode* node=deserialize(tmp);NLR(node);cout<<endl;return 0;
}

这篇关于297. 二叉树的序列化与反序列化-H的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346287

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字