Go 语言实现二叉树

本节介绍了如何使用 Go 语言实现一个二叉树,示例代码在 binTree.go 中。 下面将binTree.go 的内容分成五个部分来介绍。第一部分如下:

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. type Tree struct {
  8. Left *Tree
  9. Value int
  10. Right *Tree
  11. }

这里是使用 Go 语言中的结构体定义的树的节点。由于我们没有真实的数据,所以将使用math/rand 包向树中填充随机的数值。

binTree.go 中代码的第二部分如下:

  1. func traverse(t *Tree) {
  2. if t == nil {
  3. return
  4. }
  5. traverse(t.Left)
  6. fmt.Println(t.Value, " ")
  7. traverse(t.Right)
  8. }

traverse()函数展示了如何使用递归访问二叉树上的所有节点。

binTree.go 中的第三个代码段如下:

  1. func create(n int) *Tree {
  2. var t *Tree
  3. rand.Seed(time.Now().Unix())
  4. for i := 0; i < 2*n; i++ {
  5. temp := rand.Intn(n * 2)
  6. t = insert(t, temp)
  7. }
  8. return t
  9. }

create() 函数仅用于向树中填充随机的数值。

该程序的第四部分如下:

  1. func insert(t *Tree, v int) *Tree {
  2. if t == nil {
  3. return &Tree{nil, v, nil}
  4. }
  5. if v == t.Value {
  6. return t
  7. }
  8. if v < t.Value {
  9. t.Left = insert(t.Left, v)
  10. return t
  11. }
  12. t.Right = insert(t.Right, v)
  13. return t
  14. }

insert() 函数使用 if 语句做了很多重要的事。第一个 if 语句检查要操作的树是否为空。如果是空树,那么通过 &Tree{nil, v, nil} 创建的新节点将成为该树的根节点。第二个 if 语句判断二叉树上是否已经存在将要插入的值。如果值已经存在,那么函数将什么也不做然后返回。第三个 if 语句判断对于当前节点,被插入的值是在节点的左侧还是右侧,然后执行相应的操作。

注意,这里展示的实现创建的是非平衡二叉树。

binTree.go 的最后一部分包含如下的 Go 代码:

  1. func main() {
  2. tree := create(10)
  3. fmt.Println("The value of the root of the tree is", tree.Value)
  4. traverse(tree)
  5. fmt.Println()
  6. tree = insert(tree, -10)
  7. tree = insert(tree, -2)
  8. traverse(tree)
  9. fmt.Println()
  10. fmt.Println("The value of the root of the tree is", tree.Value)
  11. }

执行 binTree.go 将生成类似如下的输出:

  1. $ go run binTree.go
  2. The value of the root of the tree is 18
  3. 0 3 4 5 7 8 9 10 11 14 16 17 18 19
  4. -10 -2 0 3 4 5 7 8 9 10 11 14 16 17 18 19
  5. The value of the root of the tree is 18