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

 更新时间:2022年08月26日 08:43:52   作者:yi个俗人  
如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下

前言

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

二叉树概念

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

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

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(𝑛+1)⌉

创建二叉树

// 创建节点
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 结点,然后再输出左子树,然后再输出右子树。

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

func preOrder(root *bt) {
	if root != nil {
		fmt.Print(root.Val, " ")
		preOrder(root.Left)
		preOrder(root.Right)
	}
}

中序遍历(L-V-R)

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

func inOrder(root *bt) {
	if root != nil {
		inOrder(root.Left)
		fmt.Print(root.Val, " ")
		inOrder(root.Right)
	}
}

后序遍历(L-R-V)

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

func posOrder(root *bt) {
	if root != nil {
		posOrder(root.Left)
		posOrder(root.Right)
		fmt.Print(root.Val, " ")
	}
}

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

相关文章

  • PHP结构型模式之组合模式

    PHP结构型模式之组合模式

    这篇文章主要介绍了PHP组合模式Composite Pattern优点与实现,组合模式是一种结构型模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合能让客户端以一致的方式处理个别对象和对象组合
    2023-04-04
  • 一站式解决方案:在Windows和Linux上快速搭建Go语言开发环境

    一站式解决方案:在Windows和Linux上快速搭建Go语言开发环境

    本文将介绍如何在Windows和Linux操作系统下搭建Go语言开发环境,以帮助您更高效地进行Go语言开发,需要的朋友可以参考下
    2023-10-10
  • Golang超全面讲解并发

    Golang超全面讲解并发

    goroutine 不是os线程、不是绿色线程(由语言运行时管理的线程),是协程。协程是一种非抢占式的简单并发子goroutine(函数、闭包或方法),也就是说,它们不能被中断。取而代之的是,协程有多个点,允许暂停或重新进入 —Go语言并发之道
    2022-06-06
  • Go中的条件语句Switch示例详解

    Go中的条件语句Switch示例详解

    Go的switch的基本功能和C、Java类似,switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止,对Go条件语句Switch相关知识感兴趣的朋友一起看看吧
    2021-08-08
  • Go语言格式化动词使用详解

    Go语言格式化动词使用详解

    这篇文章主要介绍了Go语言格式化动词使用详解的相关资料,需要的朋友可以参考下
    2023-08-08
  • Go语言常见错误接口污染解决分析

    Go语言常见错误接口污染解决分析

    这篇文章主要为大家介绍了Go语言常见错误接口污染解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang正整数指定规则排序算法问题分析

    Golang正整数指定规则排序算法问题分析

    这篇文章主要介绍了Golang正整数指定规则排序算法问题,结合实例形式分析了Go语言排序算法操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Go 加密解密算法小结

    Go 加密解密算法小结

    加密解密在实际开发中应用比较广泛,常见的加解密分为三种,本文就详细的介绍一下Go 加密解密算法,具有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • 使用Go HTTP客户端打造高性能服务

    使用Go HTTP客户端打造高性能服务

    大多数语言都有提供各自的 HTTP 客户端,本文将动手实践如何使用Go语言发起HTTP请求,并讨论其中有可能遇到的问题。具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Go语言实现钉钉发送通知

    Go语言实现钉钉发送通知

    本文通过代码给大家介绍了Go语言实现钉钉发送通知,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11

最新评论