# 【golang】leetcode中级-二叉树的序列化与反序列化&常数时间插入、删除和获取随机元素

wric

## 第一题 二叉树的序列化与反序列化

### 解题思路

Atoi(string to int)和 Itoa(int to string)

``````func (Codec) serialize(root *TreeNode) string {
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()
}``````

``````func (Codec) deserialize(data string) *TreeNode {
sp := strings.Split(data, ",")
var build func() *TreeNode
build = func() *TreeNode {
if sp[0] == "null" {
sp = sp[1:]
return nil
}
val, _ := strconv.Atoi(sp[0])
sp = sp[1:]
return &TreeNode{val, build(), build()}
}
return build()
}``````

### 具体代码为

``````package main

import (
"strconv"
"strings"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
type Codec struct{}

func Constructor() (_ Codec) {
return
}

func (Codec) serialize(root *TreeNode) string {
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()
}

func (Codec) deserialize(data string) *TreeNode {
sp := strings.Split(data, ",")
var build func() *TreeNode
build = func() *TreeNode {
if sp[0] == "null" {
sp = sp[1:]
return nil
}
val, _ := strconv.Atoi(sp[0])
sp = sp[1:]
return &TreeNode{val, build(), build()}
}
return build()
}``````

## 第二题 常数时间插入、删除和获取随机元素

### 代码

``````type RandomizedSet struct {
m map[int]int
nums []int
}

func Constructor() RandomizedSet {
return RandomizedSet{
m:    make(map[int]int),
nums: []int{},
}
}

func (this *RandomizedSet) Insert(val int) bool {
// val存在，无需插入
if _, ok := this.m[val]; ok {
return false
}
// 若 val 不存在，插入到 nums 尾部，
// 并记录 val 对应的索引值
this.nums = append(this.nums, val)
this.m[val] = len(this.nums) - 1
return true
}

func (this *RandomizedSet) Remove(val int) bool {
// 若 val 不存在，不用再删除
if _, ok := this.m[val]; !ok {
return false
}

//存在，开始删除操作
// 拿到待删除 val 的索引
index := this.m[val]
// 最后一个元素的索引
lastIndex := len(this.nums) - 1

//完成元素交换
// 将最后一个元素对应的索引修改为 index
this.m[this.nums[lastIndex]] = index
// 交换 val 和最后一个元素 （将 val 索引位置设为最后一个值也可）
this.nums[index], this.nums[lastIndex] = this.nums[lastIndex], this.nums[index]

// 将数组中最后一个值 val 删除
this.nums = this.nums[0 : len(this.nums)-1]
// 删除元素 val 对应的索引
delete(this.m, val)
return true
}

func (this *RandomizedSet) GetRandom() int {
return this.nums[rand.Intn(len(this.nums))]
}
``````

10 声望
3 粉丝
0 条评论