Golang | Leetcode Golang题解之第297题二叉树的序列化与反序列化

题目:

题解:

type Codec struct{}

func Constructor() (_ Codec) {
    return
}

func (c Codec) serialize(root *TreeNode) string {
    if root == nil {
        return "X"
    }
    left := "(" + c.serialize(root.Left) + ")"
    right := "(" + c.serialize(root.Right) + ")"
    return left + strconv.Itoa(root.Val) + right
}

func (Codec) deserialize(data string) *TreeNode {
    var parse func() *TreeNode
    parse = func() *TreeNode {
        if data[0] == 'X' {
            data = data[1:]
            return nil
        }
        node := &TreeNode{}
        data = data[1:] // 跳过左括号
        node.Left = parse()
        data = data[1:] // 跳过右括号
        i := 0
        for data[i] == '-' || '0' <= data[i] && data[i] <= '9' {
            i++
        }
        node.Val, _ = strconv.Atoi(data[:i])
        data = data[i:]
        data = data[1:] // 跳过左括号
        node.Right = parse()
        data = data[1:] // 跳过右括号
        return node
    }
    return parse()
}
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它使用.proto文件定义数据结构和消息格式,并生成相应的代码用于序列化反序列化序列化原理: 1. 定义.proto文件,其中包含消息类型和字段定义。 2. 使用Protocol Buffers编译器将.proto文件编译成相应语言的代码。 3. 在代码中使用生成的类来设置消息的字段值。 4. 调用序列化方法将消息转换为字节流。 反序列化原理: 1. 接收字节流数据。 2. 调用反序列化方法解析字节流,并转换为特定语言的对象。 3. 使用对象中的字段值进行后续操作。 以下是使用Golang实现Protobuf的序列化反序列化的示例代码: ```go package main import ( "fmt" "log" "github.com/golang/protobuf/proto" ) // 定义.proto文件中的消息类型 type Person struct { Name string Age int32 Email string } func main() { // 创建Person对象 person := &Person{ Name: "Alice", Age: 25, Email: "alice@example.com", } // 序列化 data, err := proto.Marshal(person) if err != nil { log.Fatal("marshal error: ", err) } fmt.Printf("Serialized data: %v\n", data) // 反序列化 newPerson := &Person{} err = proto.Unmarshal(data, newPerson) if err != nil { log.Fatal("unmarshal error: ", err) } fmt.Printf("Deserialized data: %v\n", newPerson) } ``` 上述代码中,首先定义了一个`Person`消息类型,然后使用`proto.Marshal`方法将`person`对象序列化为字节流。接着使用`proto.Unmarshal`方法将字节流反序列化为`newPerson`对象。最后输出序列化前后的对象内容。 在使用该示例代码之前,需要通过`go get github.com/golang/protobuf/proto`命令安装Golang的Protobuf库。 希望以上信息能够对你有所帮助!如有更多问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值