【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕
应该会超过一部分的面试者。
对树不熟悉的朋友,可以看看前面的基础训练题哦!
leecode 297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化
为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 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
参考代码
定义一颗树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int // 根
* Left *TreeNode //左节点
* Right *TreeNode //右节点
* }
*/
GO语言版 递归
-
要知道这是一棵树,只是通过数组的形式表现出来的
简单的用这颗树来举例
关键点 :
可以先序遍历这颗二叉树,遇到空子树的时候序列化成 None,否则继续递归序列化。那么我们如何反序列化呢?首先我们需要根据 , 把原先的序列分割开来得到先序遍历的元素列表,然后从左向右遍历这个序列:
如果当前的元素为 None,则当前为空树 否则先解析这棵树的左子树,再解析它的右子树
type Codec struct {
l []string
}
func Constructor() Codec {
return Codec{}
}
func rserialize(root *TreeNode, str string) string {
if root == nil {
str += "null,"
} else {
str += strconv.Itoa(root.Val) + ","
str = rserialize(root.Left, str)
str = rserialize(root.Right, str)
}
return str
}
// Serializes a tree to a single string.
func (this *Codec) serialize(root *TreeNode) string {
return rserialize(root, "")
}
// Deserializes your encoded data to tree.
func (this *Codec) deserialize(data string) *TreeNode {
l := strings.Split(data, ",")
for i := 0; i < len(l); i++ {
if l[i] != "" {
this.l = append(this.l, l[i])
}
}
return this.rdeserialize()
}
func (this *Codec) rdeserialize() *TreeNode {
if this.l[0] == "null" {
this.l = this.l[1:]
return nil
}
val, _ := strconv.Atoi(this.l[0])
root := &TreeNode{Val: val}
this.l = this.l[1:]
root.Left = this.rdeserialize()
root.Right = this.rdeserialize()
return root
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️