家资是何物,积帙列梁梠。这篇文章主要讲述跟着动画学 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?
? 函数:
&
Treenil, v, nil
func insert(t *Tree, v int) *Tree
if t == nil
return &
Treenil, 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 &
Treenil, 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 数据结构之二叉树】
推荐阅读
- CenOS 进程管理
- [OpenCV实战]32 使用OpenCV进行非真实感渲染
- vue2.x版本中computed和watch的使用入门详解-watch篇
- 搭建组件库最小原型(支线)
- Redis lua环境
- [ 链表OJ题--C语言实现 ] 复制带随机指针的链表(带视频讲解哦)
- kettle庖丁解牛第32篇之本地和上游数据量比较后再抽取
- 路由基础之OSPFRouterID及DR和BDR的选举
- NAT网络地址转换