在Leetcode 刷题时需要按照题目要求利用题目给出的数组构建二叉树,以方便在本地调试,网上有一些版本,比如:
https://blog.csdn.net/baoxin1100/article/details/108025393
但是这些都没有golang语言的版本,请问有无golang的版本. 本人除了go,其它语言都不懂.
万分感谢.
参考下下面链接
https://blog.csdn.net/cdzg_zzk/article/details/120254462
你好,这里有一篇go语言的,康康是否有帮助
https://zhuanlan.zhihu.com/p/552327473
package main
import "fmt"
type btNode struct {
Data interface{}
Lchild *btNode
Rchild *btNode
}
type biTree struct {
root *btNode
}
func (bt *biTree) preOrder() []interface{} {
var res []interface{}
p := bt.root
Stack := make([]*btNode, 0)
for p != nil || len(Stack) > 0 {
for p != nil {
res = append(res, p.Data)
Stack = append(Stack, p)
p = p.Lchild
}
if len(Stack) > 0 {
p = Stack[len(Stack)-1]
Stack = Stack[:len(Stack)-1]
p = p.Rchild
}
}
return res
}
func (bt *biTree) inOrder() []interface{} {
var res []interface{}
p := bt.root
Stack := make([]*btNode, 0)
for p != nil || len(Stack) > 0 {
for p != nil {
Stack = append(Stack, p)
p = p.Lchild
}
if len(Stack) > 0 {
p = Stack[len(Stack)-1]
res = append(res, p.Data)
Stack = Stack[:len(Stack)-1]
p = p.Rchild
}
}
return res
}
func (bt *biTree) postOrder() []interface{} {
var res []interface{}
var cur, pre *btNode
Stack := make([]*btNode, 0)
Stack = append(Stack, bt.root)
for len(Stack) > 0 {
cur = Stack[len(Stack)-1]
if cur.Lchild == nil && cur.Rchild == nil ||
pre != nil && (pre == cur.Lchild || pre == cur.Rchild) {
res = append(res, cur.Data)
Stack = Stack[:len(Stack)-1]
pre = cur
} else {
if cur.Rchild != nil {
Stack = append(Stack, cur.Rchild)
}
if cur.Lchild != nil {
Stack = append(Stack, cur.Lchild)
}
}
}
return res
}
func createTree(list []interface{}) *biTree {
btree := &biTree{}
if len(list) > 0 {
btree.root = &btNode{Data: list[0]}
for _, data := range list[1:] {
btree.appendNode(data)
}
}
return btree
}
func (bt *biTree) appendNode(data interface{}) {
cur := bt.root
if cur == nil {
bt = &biTree{}
return
}
Queue := []*btNode{cur}
for len(Queue) > 0 {
cur := Queue[0]
Queue = Queue[1:]
if cur.Lchild != nil {
Queue = append(Queue, cur.Lchild)
} else {
cur.Lchild = &btNode{Data: data}
return
}
if cur.Rchild != nil {
Queue = append(Queue, cur.Rchild)
} else {
cur.Rchild = &btNode{Data: data}
break
}
}
}
func main() {
list := []interface{}{1, 2, 3, 4, 5, 6, 7, 8}
tree := createTree(list)
fmt.Println(tree.preOrder())
fmt.Println(tree.inOrder())
fmt.Println(tree.postOrder())
}
/*
[1 2 4 8 5 3 6 7]
[8 4 2 5 1 6 3 7]
[8 4 5 2 6 7 3 1]
*/