跟着动画学 Go 数据结构之二叉树

简介: 树可以有许多不同的形状,并且它们可以在每个节点允许的子节点数量或它们在节点内组织数据值的方式上有所不同。 而在其中最常用的树之一是二叉树。 二叉树是一棵树,其中每个节点最多可以有两个孩子。 一个孩子被识别为左孩子,另一个孩子被识别为右孩子。

树可以有许多不同的形状,并且它们可以在每个节点允许的子节点数量或它们在节点内组织数据值的方式上有所不同。 而在其中最常用的树之一是二叉树。 二叉树是一棵树,其中每个节点最多可以有两个孩子。 一个孩子被识别为左孩子,另一个孩子被识别为右孩子。


二叉树是一种数据结构,在每个节点下面最多存在两个其他节点。即一个节点要么连接至一个、两个节点或不连接其他节点。

树形结构的深度(也被称作高度)则被定义为根节点为根节点至某个节点间的最长路径,而节点的深度则表示当当前节点至树根节点间的边数。二叉树有许多不同的形状和大小。 形状取决于节点的数量和节点的链接方式。 下图说明了由九个节点组成的二叉树的三种不同形状:

网络异常,图片无法展示
|

Go 语言实现二叉树

  1. 定义二叉树的结构
package main
import (
  "fmt"
  "math/rand"
  "time"
)
type Tree struct {
  Left *Tree
  Value int
  Right *Tree
}
  1. 二叉树遍历
func traverse(t *Tree) {
  if t == nil {
    return
  }
  traverse(t.Left)
  fmt.Print(t.Value, " ")
  traverse(t.Right)
}

traverse() 函数通过递归方式访问二叉树的全部节点。

  1. 创建二叉树

利用 create() 函数利用随机整数填写二叉树:

func create(n int) *Tree {
  var t *Tree
  rand.Seed(time.Now().Unix())
  for i := 0; i < 2 * n; i++ {
    temp := rand.Intn(n * 2)
    t = insert(t, temp)
  }
  return t
}
  1. 插入值

insert 函数:

  • 第一个 if 语句在插入时如果是空树,就把插入的节点设置为根节点,并创建为 &Tree{nil, v, nil}
  • 第二个 if 语句确定插入值是否已在二叉树中存在。若存在,函数将直接返回且不执行任何操作
  • 第三个 if 语句检查插入的值位于当前节点的左孩子节点还是右孩子节点,并插入到相应的位置。
func insert(t *Tree, v int) *Tree {
  if t == nil {
    return &Tree{nil, v, nil}
  }
  if v == t.Value {
    return t
  }
  if v < t.Value {
    t.Left = insert(t.Left, v)
    return t
  }
  t.Right = insert(t.Right, v)
  return t
}

测试

package main
import (
  "fmt"
  "math/rand"
  "time"
)
type Tree struct {
  Left  *Tree
  Value int
  Right *Tree
}
func traverse(t *Tree) {
  if t == nil {
    return
  }
  traverse(t.Left)
  fmt.Print(t.Value, " ")
  traverse(t.Right)
}
func create(n int) *Tree {
  var t *Tree
  rand.Seed(time.Now().Unix())
  for i := 0; i < 2*n; i++ {
    temp := rand.Intn(n * 2)
    t = insert(t, temp)
  }
  return t
}
func insert(t *Tree, v int) *Tree {
  if t == nil {
    return &Tree{nil, v, nil}
  }
  if v == t.Value {
    return t
  }
  if v < t.Value {
    t.Left = insert(t.Left, v)
    return t
  }
  t.Right = insert(t.Right, v)
  return t
}
func main() {
  tree := create(10)
  fmt.Println("The value of the root of the tree is", tree.Value)
  traverse(tree)
  fmt.Println()
  tree = insert(tree, -10)
  tree = insert(tree, -2)
  traverse(tree)
  fmt.Println()
  fmt.Println("The value of the boot of the the tree is", tree.Value)
}

运行结果:

The value of the root of the tree is 18
0 1 4 5 6 8 9 10 12 14 15 18 19 
-10 -2 0 1 4 5 6 8 9 10 12 14 15 18 19 
The value of the boot of the the tree is 18
相关文章
|
18天前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
33 3
|
11天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
13 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
11天前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
14 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
13天前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
23 1
|
13天前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
20 1
|
15天前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
19天前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
18天前
|
存储 算法 调度
数据结构--二叉树的顺序实现(堆实现)
数据结构--二叉树的顺序实现(堆实现)
|
19天前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
19天前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解