Go 数据结构之二叉树详情

 更新时间:2022年05月07日 10:38:14   作者:宇宙之一粟  
这篇文章主要介绍了 Go 数据结构之二叉树详情,二叉树是一种数据结构,在每个节点下面最多存在两个其他节点。即一个节点要么连接至一个、两个节点或不连接其他节点,下文基于GO语言展开二叉树结构详情,需要的朋友可以参考一下

前言:

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

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

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

下图说明了由九个节点组成的二叉树的三种不同形状:

Go 语言实现二叉树

定义二叉树的结构

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)
}

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

创建二叉树

利用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
}

插入值

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

到此这篇关于 Go 数据结构之二叉树详情的文章就介绍到这了,更多相关 Go 二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang简单tls协议用法完整示例

    golang简单tls协议用法完整示例

    这篇文章主要介绍了golang简单tls用法,分析了tls协议的使用步骤及客户端与服务器端的相关实现代码,需要的朋友可以参考下
    2016-07-07
  • Go常用标准库之fmt的简介与使用详解

    Go常用标准库之fmt的简介与使用详解

    fmt 是 Go 语言中的一个常用标准库,它用于格式化输入和输出数据,这篇文章主要为大家介绍了fmt的基本使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Go空结构体struct{}的作用是什么

    Go空结构体struct{}的作用是什么

    本文主要介绍了Go空结构体struct{}的作用是什么,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 浅析Go语言中的Range关键字

    浅析Go语言中的Range关键字

    Range是go语言中很独特的一个关键词,也相当好用。下面就跟着小编来再聊聊这个Range关键字,有需要的朋友们可以参考借鉴。
    2016-09-09
  • Golang中interface是引用类型的原因解析

    Golang中interface是引用类型的原因解析

    在Go语言中,将interface设计为引用类型是为了实现更灵活、更动态的类型系统,这篇文章主要介绍了深度解析Golang中为什么interface是引用类型,需要的朋友可以参考下
    2024-01-01
  • 详解Go语言如何使用xorm实现读取mysql

    详解Go语言如何使用xorm实现读取mysql

    xorm是go语言的常用orm之一,可以用来操作数据库。本文就来和大家聊聊Go语言如何使用xorm实现读取mysql功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法

    这篇文章主要介绍了Golang中的接口相关编写方法,是Go语言入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Go语言的Windows下环境配置以及简单的程序结构讲解

    Go语言的Windows下环境配置以及简单的程序结构讲解

    这篇文章主要介绍了Go语言的Windows下环境配置以及简单的程序结构讲解,从编程语言约定俗成的hellow world开始,需要的朋友可以参考下
    2015-10-10
  • 详解Go语言RESTful JSON API创建

    详解Go语言RESTful JSON API创建

    这篇文章主要介绍了详解Go语言RESTful JSON API创建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Go语言之init函数

    Go语言之init函数

    Go语言有一个特殊的函数init,先于main函数执行,实现包级别的一些初始化操作。这篇文章介绍了Go中的Init函数,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论