2022-01-25:序列化和反序列化 N 叉树。 序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。 设计一个序列化和反
2022-01-25:序列化和反序列化 N 叉树。
序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。
设计一个序列化和反序列化 N 叉树的算法。
一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。
序列化 / 反序列化算法的算法实现没有限制。
你只需要保证 N 叉树可以被序列化为一个字符串并且该字符串可以被反序列化成原树结构即可。
注意:
N 的范围在 [1, 1000]
不要使用类成员 / 全局变量 / 静态变量来存储状态。
你的序列化和反序列化算法应是无状态的。
力扣428。
答案2022-01-25:
自然智慧。递归。
代码用golang编写。代码如下:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
a := NewNode2(1)
b := NewNode2(2)
c := NewNode2(3)
d := NewNode2(4)
e := NewNode2(5)
f := NewNode2(6)
g := NewNode2(7)
a.children = append(a.children, b)
a.children = append(a.children, c)
a.children = append(a.children, d)
b.children = append(b.children, e)
b.children = append(b.children, f)
e.children = append(e.children, g)
codec := &Codec{}
content := codec.serialize(a)
fmt.Println(content)
head := codec.deserialize(content)
fmt.Println(codec.serialize(head) == content)
}
// 不要提交这个类
type Node struct {
val int
children []*Node
}
func NewNode1() *Node {
ret := &Node{}
ret.children = make([]*Node, 0)
return ret
}
func NewNode2(_val int) *Node {
ret := &Node{}
ret.val = _val
ret.children = make([]*Node, 0)
return ret
}
func NewNode3(_val int, _children []*Node) *Node {
ret := &Node{}
ret.val = _val
ret.children = _children
return ret
}
// 提交下面这个类
type Codec struct {
}
func (this *Codec) serialize(root *Node) string {
if root == nil { // 空树!直接返回#
return "#"
}
builder := ""
this.serial(&builder, root)
return builder
}
// 当前来到head
func (this *Codec) serial(builder *string, head *Node) {
*builder += fmt.Sprint(head.val) + ","
if len(head.children) > 0 {
*builder += "[,"
for _, next := range head.children {
this.serial(builder, next)
}
*builder += "],"
}
}
func (this *Codec) deserialize(data string) *Node {
if data == "#" {
return nil
}
splits := strings.Split(data, ",")
queue := make([]string, 0)
for _, str := range splits {
queue = append(queue, str)
}
return this.deserial(&queue)
}
func (this *Codec) deserial(queue *[]string) *Node {
v, _ := strconv.Atoi((*queue)[0])
cur := NewNode2(v)
*queue = (*queue)[1:]
cur.children = make([]*Node, 0)
if len(*queue) > 0 && (*queue)[0] == "[" {
*queue = (*queue)[1:]
for (*queue)[0] != "]" {
child := this.deserial(queue)
cur.children = append(cur.children, child)
}
*queue = (*queue)[1:]
}
return cur
}
执行结果如下:

2022-01-25:序列化和反序列化 N 叉树。 序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。 设计一个序列化和反的更多相关文章
- ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...
- [leetcode]428. Serialize and Deserialize N-ary Tree序列化与反序列化N叉树
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- K:java序列化与反序列化—transient关键字的使用
首先,应该明白的是transient是java中的一个关键字,音标为 英: [ˈtrænziənt]. 在了解transient关键字之前,应该先弄明白序列化和反序列化.所谓的序列化,通俗点的 ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
- [LeetCode] 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [C# 中的序列化与反序列化](.NET 源码学习)
[C# 中的序列化与反序列化](.NET 源码学习) 关键词:序列化(概念与分析) 三种序列化(底层原理 源码) Stream(底层原理 源码) 反射(底层原理 源码) 假如有一天我 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- 第一章 JacksonUtil 序列化与反序列化属性总结
1.json-lib与Jackson 关于json-lib与Jackson对比总结如下: 1).性能方面,Jackson的处理能力高出Json-lib10倍左右. 2).json-lib已经停止更新, ...
- day5-python中的序列化与反序列化-json&pickle
一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...
随机推荐
- 不同时间格式转换问题_python2
def unix_to_cst(data): """2019-03-17 11:00:00 --> Sun, 17 Mar 2019 11:00:00 GMT+08 ...
- pytorch的dataset与dataloader解析
整理一下pytorch获取的流程: 创建Dataset对象 创建DataLoader对象,装载有dataset对象 循环DataLoader对象,DataLoader.__iter__返回的是Data ...
- 2022年8月学科能力综合测试(TACA)试题解答 Mathemaitca练习
目录 试题地址 1 4 5 10 13 你让我猜我肯定这么猜 试题地址 https://k.sina.com.cn/article_2897328623_acb1b9ef019011qen.html ...
- Django笔记二之连接数据库、执行migrate数据结构更改操作
本篇笔记目录索引如下: Django 连接mysql,执行数据库表结构迁移步骤介绍 操作数据库,对数据进行简单操作 接下来几篇笔记都会介绍和数据库相关,包括数据库的连接.操作(包括增删改查).对应的字 ...
- flex弹性盒子中flex-grow与flex的区别
大家在使用flex布局的时候很多情况下都会用到flex-grow这个属性, flex-grow 属性用于设置父元素剩余空间的瓜分比例, flex 属性是 flex-grow.flex-shrink ...
- 90 条简单实用的 Python 编程技巧,建议收藏
编码原则 建议 1:理解 Pythonic 概念 -- 详见 Python 中的<Python 之禅> 建议 2:编写 Pythonic 代码 避免不规范代码,比如只用大小写区分变量.使用 ...
- 001-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/
推荐阅读 000-从零开始的数据结构与算法 001-01-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/ 002-两数相加 add two numbers ...
- ApplicationRunner 类说明
在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为 CommandLin ...
- golang pprof 监控系列(1) —— go trace 统计原理与使用
golang pprof 监控系列(1) -- go trace 统计原理与使用 服务监控系列文章 服务监控系列视频 关于go tool trace的使用,网上有相当多的资料,但拿我之前初学golan ...
- 全面了解 Redis 高级特性,实现高性能、高可靠的数据存储和处理
目录 高性能.高可用.高可扩展性的原理 持久化 RDB持久化 AOF持久化 持久化的配置 RDB配置 AOF配置 持久化的恢复 RDB的恢复 AOF的恢复 RDB和AOF的选择 持久化对性能的影响 数 ...