Go语言-二叉树

目录

前言

1、前序遍历

2、中序遍历

3、后序遍历


前言

满足以下两个条件的数就是二叉树:

1.本身是有序树;

2.树中包含的各个节点的度不能超过2,即只能是0、1或者2。

1、前序遍历

示例:用递归的方式遍历。(根左右)

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 = 80

	//左子树
	var left1 Student
	left1.Name = "left1"
	left1.Age = 19
	left1.Score = 81

	root.left = &left1

	//右子树
	var right1 Student
	right1.Name = "right1"
	right1.Age = 20
	right1.Score = 80

	root.right = &right1

	//二级左子树
	var left2 Student
	left2.Name = "left2"
	left2.Age = 29
	left2.Score = 91

	left1.left = &left2

	//遍历函数
	Req(&root)
}

func Req(tmp *Student) {
	if tmp == nil {
		return
	}
	//输出当前节点
	fmt.Println(*tmp)
	//递归遍历下一个左节点
	Req(tmp.left)
	//递归遍历下一个右节点
	Req(tmp.right)
}

//运行结果为:
{root 18 80 0xc000112480 0xc0001124b0}
{left1 19 81 0xc0001124e0 <nil>}
{left2 29 91 <nil> <nil>}
{right1 20 80 <nil> <nil>}

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 = 80

	//左子树
	var left1 Student
	left1.Name = "left1"
	left1.Age = 19
	left1.Score = 81

	root.left = &left1

	//右子树
	var right1 Student
	right1.Name = "right1"
	right1.Age = 20
	right1.Score = 80

	root.right = &right1

	//二级左子树
	var left2 Student
	left2.Name = "left2"
	left2.Age = 29
	left2.Score = 91

	left1.left = &left2

	//遍历函数
	Req(&root)
}

func Req(tmp *Student) {
	if tmp == nil {
		return
	}

	//递归遍历下一个左节点
	Req(tmp.left)
	//输出根节点
	fmt.Println(*tmp)
	//递归遍历下一个右节点
	Req(tmp.right)
}

//运行结果为:
{left2 29 91 <nil> <nil>}
{left1 19 81 0xc0000924e0 <nil>}
{root 18 80 0xc000092480 0xc0000924b0}
{right1 20 80 <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 = 80

	//左子树
	var left1 Student
	left1.Name = "left1"
	left1.Age = 19
	left1.Score = 81

	root.left = &left1

	//右子树
	var right1 Student
	right1.Name = "right1"
	right1.Age = 20
	right1.Score = 80

	root.right = &right1

	//二级左子树
	var left2 Student
	left2.Name = "left2"
	left2.Age = 29
	left2.Score = 91

	left1.left = &left2

	//遍历函数
	Req(&root)
}

func Req(tmp *Student) {
	if tmp == nil {
		return
	}

	//递归遍历下一个左节点
	Req(tmp.left)

	//递归遍历下一个右节点
	Req(tmp.right)

	//输出根节点
	fmt.Println(*tmp)
}

//运行结果为:
{left2 29 91 <nil> <nil>}
{left1 19 81 0xc0000c24b0 <nil>}
{right1 20 80 <nil> <nil>}
{root 18 80 0xc0000c2450 0xc0000c2480}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值