脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言数据结构之二叉树必会知识点总结

Go语言数据结构之二叉树必会知识点总结

2022-11-13 11:03yi个俗人 Golang

如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下

前言

如果你是一个开发人员,或多或少对树型结构都有一定的认识,我个人对树型数据结构是又爱又恨。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。这篇文章主要分享下关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。

二叉树概念

二叉树是具有两个节点的树形结构,通常左边的子树被称为左子树,右边的子树称为右子树,图示如下:

Go语言数据结构之二叉树必会知识点总结

在代码中我们可以用代码来定义一个二叉树结构:

?
1
2
3
4
5
type treeNode struct {
    Val string      //节点值
    left *treeNode  //左节点
    right *treeNode //右节点
}

二叉树的性质

若二叉树结点的层次从1开始,则在二叉树第i层最多有2i-1 (i > 0)个节点。

深度为k的二叉树至少有k个结点,最多有2i - 1个结点。

对任何一个二叉树,如果其叶结点有n0 个,度为2的非叶结点有n2 个,则有 n0 = n2 + 1

具有n个结点的完全二叉树的深度为⌈log2(n+1)⌉

创建二叉树

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 创建节点
func CreateBinaryTree(data string) *treeNode {
    return &treeNode{data, nil, nil}
}
 
// 插入节点
func (node *treeNode) Insert(n *treeNode, data string) bool {
    cur := n
    for cur != nil {
        if cur.Val < data {
            if cur.Right != nil {
                cur = cur.Right
            } else {
                cur.Right = CreateBinaryTree(data)
                return true
            }
        } else {
            if cur.Left != nil {
                cur = cur.Left
            } else {
                cur.Left = CreateBinaryTree(data)
                return true
            }
        }
    }
    return false
}

树的遍历

树的遍历分为三种方式,分别为前序遍历,中序遍历,后序遍历。

前序遍历(V-L-R)

前序遍历访问顺序为先输 root 结点,然后再输出左子树,然后再输出右子树。

我们通过递归的方式进行遍历

Go语言数据结构之二叉树必会知识点总结

?
1
2
3
4
5
6
7
func preOrder(root *bt) {
    if root != nil {
        fmt.Print(root.Val, " ")
        preOrder(root.Left)
        preOrder(root.Right)
    }
}

中序遍历(L-V-R)

中序遍历访问顺序为先输出 root 的左子树,再输 root 结点,最后输出 root 的右子树。

Go语言数据结构之二叉树必会知识点总结

?
1
2
3
4
5
6
7
func inOrder(root *bt) {
    if root != nil {
        inOrder(root.Left)
        fmt.Print(root.Val, " ")
        inOrder(root.Right)
    }
}

后序遍历(L-R-V)

后序遍历访问顺序为先输出 root 的左子树,最后输出 root 的右子树,再输 root 结点。

Go语言数据结构之二叉树必会知识点总结

?
1
2
3
4
5
6
7
func posOrder(root *bt) {
    if root != nil {
        posOrder(root.Left)
        posOrder(root.Right)
        fmt.Print(root.Val, " ")
    }
}

到此这篇关于Go语言数据结构之二叉树必会知识点总结的文章就介绍到这了,更多相关Go语言二叉树内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7135758520955174920

延伸 · 阅读

精彩推荐
  • Golang解决go mod私有仓库拉取的问题

    解决go mod私有仓库拉取的问题

    这篇文章主要介绍了解决go mod私有仓库拉取的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    uxff6432021-06-20
  • Golanggolang遍历时修改被遍历对象的示例详解

    golang遍历时修改被遍历对象的示例详解

    这篇文章主要介绍了golang遍历时修改被遍历对象的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    janbar9262021-03-26
  • Golanggo等待一组协程结束的操作方式

    go等待一组协程结束的操作方式

    这篇文章主要介绍了go等待一组协程结束的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cj_2866152021-06-15
  • Golanggolang通过node_exporter监控GPU及cpu频率、温度的代码

    golang通过node_exporter监控GPU及cpu频率、温度的代码

    node_exporter这个开源组件是配合prometheus收集主机操作系统层的metrics的常用组件,但是官方没有提供GPU卡的metrics的采集,今天通过本文给大家介绍golang通过...

    爷来辣6482022-10-07
  • GolangGo语言中的Iota关键字

    Go语言中的Iota关键字

    这篇文章介绍了Go语言中的Iota关键字,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    奋斗的大橙子9962022-07-16
  • Golanggolang特有程序结构入门教程

    golang特有程序结构入门教程

    GO语言是一门不错的编程语言能够到达静态编译语言的安全和性能,在本文中重点给大家介绍goland特有程序结构及引用类型别名的特征,感兴趣的朋友跟随...

    顶级饮水机管理员6022021-08-07
  • Golanggolang中对"引用传递"的误解

    golang中对"引用传递"的误解

    这篇文章主要介绍了golang中对“引用传递”的误解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    kumfo4492021-08-10
  • Golanggolang类型推断与隐式类型转换

    golang类型推断与隐式类型转换

    这篇文章主要介绍了golang类型推断与隐式类型转换,golang类型推断可以省略类型,像写动态语言代码一样,让编程变得更加简单,同时也保留了静态类型的...

    ysj9222022-10-26