Go语言 二叉树遍历

简介: 1. 二叉树的定义2. 前序遍历3. 中序遍历4. 后序遍历

1. 二叉树的定义


  • 二叉树需满足的条件
    ① 本身是有序树
    ② 树中包含的各个节点的长度不能超过2,即只能是0、1或者2

在这里插入图片描述


2. 前序遍历


前序遍历二叉树的顺序:根——》左——》右


package main
import "fmt"
//定义结构体
type Student struct {
  Name  string
  Age   int
  Score float32
  left  *Student //左子树指针
  right *Student //右子树指针
}
//二叉树定义
func main() {
  //根节点
  var root Student
  root.Name = "root"
  root.Age = 18
  root.Score = 88
  //一级左子树
  var left1 Student
  left1.Name = "left1"
  left1.Age = 20
  left1.Score = 80
  root.left = &left1
  //一级右子树
  var right1 Student
  right1.Name = "right1"
  right1.Age = 22
  right1.Score = 100
  root.right = &right1
  //二级左子树
  var left2 Student
  left2.Name = "left2"
  left2.Age = 25
  left2.Score = 90
  left1.left = &left2
  //调用遍历函数
  Req(&root)
}
//递归算法遍历整个二叉树
func Req(tmp *Student) {
  for tmp == nil {
    return
  }
  fmt.Println(tmp)
  //遍历左子树
  Req(tmp.left)
  //遍历右子树
  Req(tmp.right)
}
//输出结果如下
&{root 18 88 0xc0000c0480 0xc0000c04b0}
&{left1 20 80 0xc0000c04e0 <nil>}
&{left2 25 90 <nil> <nil>}
&{right1 22 100 <nil> <nil>}


3. 中序遍历


中序遍历:左——》根——》右


package main
import "fmt"
//定义结构体
type Student struct {
  Name  string
  Age   int
  Score float32
  left  *Student //左子树指针
  right *Student //右子树指针
}
//二叉树定义
func main() {
  //根节点
  var root Student
  root.Name = "root"
  root.Age = 18
  root.Score = 88
  //一级左子树
  var left1 Student
  left1.Name = "left1"
  left1.Age = 20
  left1.Score = 80
  root.left = &left1
  //一级右子树
  var right1 Student
  right1.Name = "right1"
  right1.Age = 22
  right1.Score = 100
  root.right = &right1
  //二级左子树
  var left2 Student
  left2.Name = "left2"
  left2.Age = 25
  left2.Score = 90
  left1.left = &left2
  //调用遍历函数
  Req(&root)
}
//递归算法遍历整个二叉树
func Req(tmp *Student) {
  for tmp == nil {
    return
  }
  //遍历左子树
  Req(tmp.left)
  //输出root节点
  fmt.Println(tmp)
  //遍历右子树
  Req(tmp.right)
}
//输出结果如下
&{left2 25 90 <nil> <nil>}
&{left1 20 80 0xc000114510 <nil>}
&{root 18 88 0xc0001144b0 0xc0001144e0}
&{right1 22 100 <nil> <nil>}


4. 后序遍历


后序遍历:左——》右——》根


package main
import "fmt"
//定义结构体
type Student struct {
  Name  string
  Age   int
  Score float32
  left  *Student //左子树指针
  right *Student //右子树指针
}
//二叉树定义
func main() {
  //根节点
  var root Student
  root.Name = "root"
  root.Age = 18
  root.Score = 88
  //一级左子树
  var left1 Student
  left1.Name = "left1"
  left1.Age = 20
  left1.Score = 80
  root.left = &left1
  //一级右子树
  var right1 Student
  right1.Name = "right1"
  right1.Age = 22
  right1.Score = 100
  root.right = &right1
  //二级左子树
  var left2 Student
  left2.Name = "left2"
  left2.Age = 25
  left2.Score = 90
  left1.left = &left2
  //调用遍历函数
  Req(&root)
}
//递归算法遍历整个二叉树
func Req(tmp *Student) {
  for tmp == nil {
    return
  }
  //遍历左子树
  Req(tmp.left)
  //遍历右子树
  Req(tmp.right)
  //输出root节点
  fmt.Println(tmp)
}
//输出结果如下
&{left2 25 90 <nil> <nil>}
&{left1 20 80 0xc0000c04e0 <nil>}
&{right1 22 100 <nil> <nil>}
&{root 18 88 0xc0000c0480 0xc0000c04b0}
相关文章
|
5天前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
53 22
零值在go语言和初始化数据
|
1天前
|
Cloud Native Java Go
为什么要学习Go语言?
GO logo的核心理念,即简单胜于复杂。使用现代斜体无衬线字体与三条简单的运动线相结合,形成一个类似于快速运动的两个轮子的标记,传达速度和效率。字母的圆形暗示了GO地鼠的眼睛,创造了一个熟悉的形状,让标记和吉祥物很好地搭配在一起。
12 4
|
5天前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
17 1
|
5天前
|
Go
go语言中格式化输出的占位符
【7月更文挑战第10天】`fmt` 包在 Go 语言中用于格式化输出,包括不同类型的占位符:%v(默认格式)、%+v(带字段名的结构体)、%#v(Go语法表示)、%T(类型表示)、%%(百分号)。布尔值用%t,整数有%b、%c、%d、%o、%q、%x、%X和%U。浮点数和复数用%b、%e、%E、%f、%g、%G。字符串和字节切片用%s、%q、%x、%X。指针用%p。占位符可配合+、-、#、空格和0进行调整。宽度和精度控制输出格式,例如 %.4g 控制小数精度。Go 没有 `%u`,但无符号整数默认打印为正数。运算符包括逻辑、比较、加减、乘除、移位、按位和按位异或等。
17 1
|
3天前
|
安全 Go
Go语言map并发安全,互斥锁和读写锁谁更优?
Go并发编程中,`sync.Mutex`提供独占访问,适合读写操作均衡或写操作频繁的场景;`sync.RWMutex`允许多个读取者并行,适用于读多写少的情况。明智选择锁可提升程序性能和稳定性。示例展示了如何在操作map时使用这两种锁。
6 0
|
3天前
|
安全 Go 开发者
Go语言map并发安全使用的正确姿势
在Go并发编程中,由于普通map不是线程安全的,多goroutine访问可能导致数据竞态。为保证安全,可使用`sync.Mutex`封装map或使用从Go 1.9开始提供的`sync.Map`。前者通过加锁手动同步,后者内置并发控制,适用于多goroutine共享。选择哪种取决于具体场景和性能需求。
6 0
|
3天前
|
存储 安全 Java
Go语言中的map为什么默认不是并发安全的?
Go语言的map默认不保证并发安全,以优化性能和简洁性。官方建议在需要时使用`sync.Mutex`保证安全。从Go 1.6起,并发读写map会导致程序崩溃,鼓励开发者显式处理并发问题。这样做的哲学是让代码更清晰,并避免不必要的性能开销。
4 0
|
Go
golang遍历返回全部目录不返回具体的文件名
使用参考: d := dir.NewDir("/") dirs, err := d.LoopLevelDir(0) // 实现遍历目录的功能// 也可以指定层级遍历,遍历几层目录package dir import ( "fmt" "io/ioutil" "strings" "time" ) t...
898 0
|
7天前
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
68 1
在go语言中使用泛型和反射
|
9天前
|
缓存 编译器 Shell
回顾go语言基础中一些特别的概念
【7月更文挑战第6天】本文介绍Go语言基础涵盖包声明、导入、函数、变量、语句和表达式以及注释。零值可用类型如切片、互斥锁和缓冲,支持预分配容量以优化性能。
40 2
回顾go语言基础中一些特别的概念