时间复杂度:O(n)
解题思路
看给的模板花里胡哨,实际上就是考察先序遍历二叉树将结点值序列化成字符串,以及根据一个字符串建树。
对于序列化函数,通过先序遍历的方式将结点值追加到字符串中,并在其后添加一个逗号用来分隔不同结点的值。这里为了提高效率,用到了strings包的Builder,通过调用WriteString和WriteByte方法实现字符串拼接,最后将Builder转换为string并返回。
对于反序列化函数,就是根据字符串的逗号进行分割,将分割出来的所有结点值都保存到切片中,接下来就是根据先序遍历的方法构建一棵树。切片的第一个字符串就是先序遍历到的结点值的字符串形式,先利用strconv包的Atoi函数将字符串形式的数字转换为int类型,然后先序遍历函数返回一个新创建的TreeNode,val就是转换后的val,左右孩子就是递归返回的结点。
AC代码
基本抄的官方题解。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
type Codec struct {
}
func Constructor()(_ Codec) {
return
}
// Serializes a tree to a single string.
func (this *Codec) serialize(root *TreeNode) string {
res:=&strings.Builder{}
var dfs func(*TreeNode)
dfs=func(root *TreeNode){
if root==nil{
res.WriteString("null,")
return
}
res.WriteString(strconv.Itoa(root.Val))
res.WriteByte(',')
dfs(root.Left)
dfs(root.Right)
}
dfs(root)
return res.String()
}
// Deserializes your encoded data to tree.
func (this *Codec) deserialize(data string) *TreeNode {
nodes:=strings.Split(data,",")
var create func() *TreeNode
create=func()*TreeNode{
if nodes[0]=="null"{
nodes=nodes[1:]
return nil
}
val,_:=strconv.Atoi(nodes[0])
nodes=nodes[1:]
return &TreeNode{val,create(),create()}
}
return create()
}
/**
* Your Codec object will be instantiated and called as such:
* ser := Constructor();
* deser := Constructor();
* data := ser.serialize(root);
* ans := deser.deserialize(data);
*/
感悟
分明就是比较简单的根据二叉树将结点值组合成字符串和根据字符串各节点值建树。模板里给了好多无用的东西。