1 Star 2 Fork 1

masx200/leetcode-TreeNode-go

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
tree.go 2.36 KB
一键复制 编辑 原始数据 按行查看 历史
masx200 提交于 2022-08-21 10:50 +08:00 . Update tree.go
package treenode
import (
"errors"
"fmt"
"strconv"
"strings"
)
// TreeNode binary tree node representation with Int value
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// NewTreeNode deserializes raw data and creates a new TreeNode
func NewTreeNode(data string) (*TreeNode, error) {
if len(data) < 2 {
return nil, errors.New("invalid input")
}
nodes := strings.Split(
strings.TrimSuffix(strings.TrimPrefix(data, "["), "]"),
Separator,
)
rootVal, err := strconv.Atoi(nodes[0])
if err != nil {
return nil, err
}
root := &TreeNode{Val: rootVal}
err = bfsBuild(&NodeQueue{root}, nodes[1:])
if err != nil {
return nil, err
}
return root, nil
}
func (t TreeNode) String() string { return t.serialize() }
func (t TreeNode) serialize() string {
data := bfs(&NodeQueue{&t})
// remove redundant nulls
i := len(data) - 1
for data[i] == EmptyNodeMark {
i--
}
return fmt.Sprintf("[%s]", strings.Join(data[:i+1], Separator))
}
// EmptyNodeMark is used to mark empty node in serialized string
const (
EmptyNodeMark = "null"
Separator = ","
)
func bfs(q *NodeQueue) []string {
var (
nextQ NodeQueue
level []string
isEmptyLevel = true
)
for !q.IsEmpty() {
n := q.Pop()
if n != nil {
level = append(level, strconv.Itoa(n.Val))
nextQ.Push(n.Left, n.Right)
isEmptyLevel = false
} else {
level = append(level, EmptyNodeMark)
}
}
if isEmptyLevel {
return nil
}
return append(level, bfs(&nextQ)...)
}
func bfsBuild(q *NodeQueue, data []string) error {
if len(data) == 0 || q == nil {
return nil
}
var nextQ NodeQueue
for !q.IsEmpty() {
n := q.Pop()
if n != nil {
// if the data tail of current level contains only nulls, they could be reduced.
// that means, if the data becomes empty earlier than level does, there is no more nodes
if len(data) == 0 {
return nil
}
l := data[0]
data = data[1:]
if l != EmptyNodeMark {
if lVal, lErr := strconv.Atoi(l); lErr == nil {
n.Left = &TreeNode{Val: lVal}
} else {
return lErr
}
}
nextQ.Push(n.Left)
if len(data) == 0 {
return nil
}
r := data[0]
data = data[1:]
if r != EmptyNodeMark {
if rVal, rErr := strconv.Atoi(r); rErr == nil {
n.Right = &TreeNode{Val: rVal}
} else {
return rErr
}
}
nextQ.Push(n.Right)
}
}
return bfsBuild(&nextQ, data)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/masx200/leetcode-TreeNode-go.git
git@gitee.com:masx200/leetcode-TreeNode-go.git
masx200
leetcode-TreeNode-go
leetcode-TreeNode-go
v1.0.4

搜索帮助