刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

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

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

提示: 输入输出格式与 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

思路

没太难抓到这个题的点,定位困难可能是难在开放性?

没太懂,不过感觉用一个遍历方法序列化,用相同的方法反序列化即可,注意空节点处理就OK

代码

type Codec struct {}

func Constructor() Codec {return Codec{}}

// Serializes a tree to a single string.
func (this *Codec) serialize(root *TreeNode) string {
    str := ""
    // dfs 方式序列化,同样方式解析即可,最关键的应该就是空节点的处理
    var dfs func(*TreeNode) 
    dfs = func(root *TreeNode) {
        if root == nil {
            str += "n,"
            return 
        }
        str += strconv.Itoa(root.Val) + ","
        dfs(root.Left)
        dfs(root.Right)
    }
    dfs (root)
    return str
}

// Deserializes your encoded data to tree.
func (this *Codec) deserialize(data string) *TreeNode {    
    nodes := strings.Split(data, ",")
    i := 0
    // 同样 dfs 方式反序列化,注意空节点的处理
    var dfs func() *TreeNode
    dfs = func() *TreeNode {
        if nodes[i] == "n" {
            i++
            return nil
        }
        v, _ := strconv.Atoi(nodes[i])
        i++
        return &TreeNode{Val: v, Left: dfs(), Right: dfs()}
    }
    return dfs()
}