前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树的遍历 | Go基础

树的遍历 | Go基础

作者头像
用户1093396
发布2020-10-29 11:28:50
5310
发布2020-10-29 11:28:50
举报

前言

用Go语言复习下树的遍历:

  • 前序
  • 中序
  • 后序
  • 层序

准备

一个简单的二叉树:

代码语言:javascript
复制
.     1
    /   \
  2       3
 / \    /  \
4   5  6    7
      / \
     8   9

推理出,理论输出:

代码语言:javascript
复制
前序输出: 1 2 4 5 3 6 8 9 7
中序输出: 4 2 5 1 8 6 9 3 7
后序输出: 4 5 2 8 9 6 7 3 1
层序输出: 1 2 3 4 5 6 7 8 9

代码:

代码语言:javascript
复制
// Tree 二叉树的基础结构体
type Tree struct {
    // 值
    Val    int
    // 左子节点指针
    Left   *Tree
    // 右子节点指针
    Right  *Tree
    // 是否是根节点
	IsRoot bool
}
代码语言:javascript
复制
// 初始化这个简单的二叉树
var node9 = &Tree{
	Val: 9,
}
var node8 = &Tree{
	Val: 8,
}
var node7 = &Tree{
	Val: 7,
}
var node6 = &Tree{
	Val:   6,
	Left:  node8,
	Right: node9,
}
var node5 = &Tree{
	Val: 5,
}
var node4 = &Tree{
	Val: 4,
}
var node3 = &Tree{
	Val:   3,
	Left:  node6,
	Right: node7,
}
var node2 = &Tree{
	Val:   2,
	Left:  node4,
	Right: node5,
}
var root = &Tree{
	Val:    1,
	Left:   node2,
	Right:  node3,
	IsRoot: true,
}

遍历

前序

代码语言:javascript
复制
// 前序
func preorder(t *Tree) {
	if t == nil {
		return
	}
	fmt.Println(t.Val)
	preorder(t.Left)
	preorder(t.Right)
}

func main() {
	fmt.Println("前序遍历开始...")
	preorder(root)
	fmt.Println("")
}

输出:

代码语言:javascript
复制
[Running] go run "../easy-tips/go/src/algorithm/tree.go"
前序遍历开始...
1
2
4
5
3
6
8
9
7

中序

代码语言:javascript
复制
// 中序
func inorder(t *Tree) {
	if t == nil {
		return
	}
	inorder(t.Left)
	fmt.Println(t.Val)
	inorder(t.Right)
}

func main() {
	fmt.Println("中序遍历开始...")
	inorder(root)
	fmt.Println("")
}

输出:

代码语言:javascript
复制
[Running] go run "../easy-tips/go/src/algorithm/tree.go"
中序遍历开始...
4
2
5
1
8
6
9
3
7

后序

代码语言:javascript
复制
// 后序
func postorder(t *Tree) {
	if t == nil {
		return
	}
	postorder(t.Left)
	postorder(t.Right)
	fmt.Println(t.Val)
}

func main() {
	fmt.Println("前序遍历开始...")
	preorder(root)
    fmt.Println("")
}

输出:

代码语言:javascript
复制
[Running] go run "../easy-tips/go/src/algorithm/tree.go"
后序遍历开始...
4
5
2
8
9
6
7
3
1

层序

使用队列达到有序的目的。

代码语言:javascript
复制
// Queue 队列
type Queue struct {
	Val    []*Tree
	Length int
}

// Push 入队列
func (q *Queue) Push(t *Tree) {
	q.Val = append(q.Val, t)
}

// Pop 出队列
func (q *Queue) Pop() (node *Tree) {
	len := q.Len()
	if len == 0 {
		panic("Queue is empty")
	}
	node = q.Val[0]
	if len == 1 {
		q.Val = []*Tree{}
	} else {
		q.Val = q.Val[1:]
	}
	return
}

// Len 队列长度
func (q *Queue) Len() int {
	q.Length = len(q.Val)
	return q.Length
}

// 层序
func levelorder(r *Tree) {
	queue := Queue{}
	queue.Push(root)
	for queue.Len() > 0 {
		node := queue.Pop()
		if node == nil {
			panic("node is nil")
		}
		// 打印根结点
		if node.IsRoot {
			fmt.Println(node.Val)
		}
		if node.Left != nil {
			fmt.Println(node.Left.Val)
			queue.Push(node.Left)
		}
		if node.Right != nil {
			fmt.Println(node.Right.Val)
			queue.Push(node.Right)
		}
	}
}

func main() {
	fmt.Println("层序遍历开始...")
	levelorder(root)
	fmt.Println("")
}

输出:

代码语言:javascript
复制
[Running] go run "../easy-tips/go/src/algorithm/tree.go"
层序遍历开始...
1
2
3
4
5
6
7
8
9

结语

本文便于,后续回忆复习使用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TIGERB的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 准备
  • 遍历
    • 前序
      • 中序
        • 后序
          • 层序
          • 结语
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档