序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例 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]
提示:
输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,也可以采用其他的方法解决这个问题。
树中结点数在范围 [0, 104] 内
-1000 <= Node.val <= 1000
dfs,先序遍历,难点在于反序列化,当时没绕过弯来。
Go这里用到了strings.Builder,这个常用于拼接字符串
- class Codec:
-
- def serialize(self, root: TreeNode) -> str:
- """Encodes a tree to a single string.
- :type root: TreeNode
- :rtype: str
- """
- if not root:
- return 'None'
- root.left = self.serialize(root.left)
- root.right = self.serialize(root.right)
- return f"{root.val},{root.left},{root.right}"
-
-
- def deserialize(self, data: str) -> TreeNode:
- """Decodes your encoded data to tree.
- :type data: str
- :rtype: TreeNode
- """
- queue = data.split(',')
- def build(queue):
- val = queue.pop(0)
- if val == 'None':
- return None
- root = TreeNode(int(val))
- root.left = build(queue)
- root.right = build(queue)
- return root
- return build(queue)
- type Codec struct {
- }
-
- func Constructor() Codec {
- return Codec{}
- }
-
- // Serializes a tree to a single string.
- func (this *Codec) serialize(root *TreeNode) string {
- var sb strings.Builder
- var dfs func(*TreeNode)
- dfs = func(node *TreeNode) {
- if node == nil {
- sb.WriteString("null,")
- return
- }
- sb.WriteString(strconv.Itoa(node.Val))
- sb.WriteByte(',')
- dfs(node.Left)
- dfs(node.Right)
- }
- dfs(root)
- return sb.String()
- }
-
- // Deserializes your encoded data to tree.
- func (this *Codec) deserialize(data string) *TreeNode {
- queue := strings.Split(data, ",")
- var build func() *TreeNode
- build = func() *TreeNode {
- if queue[0] == "null" {
- queue = queue[1:]
- return nil
- }
- val, _ := strconv.Atoi(queue[0])
- queue = queue[1:]
- return &TreeNode{
- Val: val,
- Left: build(),
- Right: build(),
- }
- }
- return build()
- }