Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。

我们主要针对二叉树的概念,go实战实现二叉树的前序遍历、中序遍历、后序遍历。

二叉树概念

在计算机科学领域内,二叉树代表的是具有两个节点的树形结构,通常子树被称作为“左子树”,右边的被称作为“右子树”。二叉树通常的应用于实现二叉查找树和二叉堆。

例如上述图片中,我们就制定了一个二叉树,其中d、e、f称作a树的叶子节点。

[叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点]

b和c 作为树a的孩子结点,b和a因为作为一个根a的孩子,所以他们的称呼为兄弟结点。其实总结一点就是关于二叉树各个结点的称呼其实和我们在家庭中,对于各个亲戚长辈的称呼类似。

在百度百科中也归纳除了关于二叉树的分类

一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。

具有n个结点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。

所以通过我们上面的理论基础,我们结合代码来实现一下我们的二叉树结构。

如图所示 ,我们定义了一个树treeNode的结构体,关于结构体的分享,小栈君会在下一期对大家进行分享。对于go语言专题分享已经过了差不多三分之一,接下来我们会开启新的分享之旅,还请各位持续关注“IT干货栈”。

闲话不多说,我们在结构体中定义了三个参数,一个是树的名称,一个是树的左节点和右节点。请各位小伙伴注意哦,这里的用的是指针,因为在go语言中如果说不用引用传递,在后续添加节点后是没有任何效果的,下面我会给大家进行演示一下。



当我们将节点定义为不是引用类型的时候,直接编译器都通不过,报了一个无效的递归类型的错误。



所以我们先初始化一个根节点名称为“It干货栈”的节点,然后左节点名称为It ,右节点为干货。两个子节点就都没有左右节点。为了后续二叉树的遍历提供更多的数据,我们将增加方法进行追加树的节点。

// 定义一个树的节点 [IT干货栈]
type treeNode struct {
name string // 定义树的名称
left *treeNode // 左节点
right *treeNode // 右节点
} // It干货栈
func main() {
var node = treeNode{name: "It干货栈", left: &treeNode{name: "It", left: nil}, right: &treeNode{name: "干货"}}
addLeftNode(&node, 2)
addLeftNode(node.left, 3)
addLeftNode(node.left.left, 4)
addLeftNode(node.left.left.left, 5)
node.addRightNode(2)
node.right.addRightNode(3)
node.right.right.addRightNode(4)
node.right.right.right.addRightNode(5)
fmt.Println(node)
} // 增加二叉树左节点
func addLeftNode(node *treeNode, value int) {
children := treeNode{name: fmt.Sprintf("子节点%s%d", "It干货栈", value)}
node.left = &children
} // 增加二叉树右节点
func (node *treeNode) addRightNode(value int) {
children := treeNode{
name: fmt.Sprint("关注公众号", value),
left: nil,
right: nil,
}
node.right = &children
}

以上代码我们我们定义了一个树节点,并且增加了相关的增加的节点的方法,细心的小伙伴可能已经看出来了,我们增加左节点和增加右节点的方法并不相同,那是因为在go语言中我们不仅可以写通用方法,比如增加二叉树左节点addLeftNode 方法。

我们还可以指定仅为treeNode专属方法addRightNode。

我们在添加了很多节点后,如果是采用传统的print打印出来的结果,如下图所示



所以接下来小栈君将为大家分享关于二叉树的前序、中序、后序遍历。

二叉树遍历

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

前序遍历

二叉树的前序遍历,又称为先序遍历。在二叉树的前序的顺序,首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树。



是不是很简单的代码就完成了我们关于二叉树的前序遍历。先访问根节点,然后依次遍历右节点和左节点,当然我们也可以交换顺序进行先遍历左节点在继续遍历右节点。

中序遍历

关于go语言中序遍历的顺序,首先中序遍历左(右)子树,再访问根,最后中序遍历右(左)子树。

后序遍历

go语言的后序遍历顺序是首先后序遍历左(右)子树,再后序遍历右(左)子树,最后访问根。那么他的顺序就应该如图所示:



以上就是关于二叉树的遍历的分享,关于二叉树的讲解我们就到这里,对于先序遍历,中序遍历,后续遍历,其实其实也就是遍历的顺序不同而已,接下来就附上当前测试用例的代码。

// 定义一个树的节点 [IT干货栈]
type treeNode struct {
name string // 定义树的名称
left *treeNode // 左节点
right *treeNode // 右节点l
} // It干货栈
func main() {
var node = treeNode{name: "It干货栈", left: &treeNode{name: "It", left: nil}, right: &treeNode{name: "干货"}}
addLeftNode(&node, 2)
addLeftNode(node.left, 3)
addLeftNode(node.left.left, 4)
addLeftNode(node.left.left.left, 5)
node.addRightNode(2)
node.right.addRightNode(3)
node.right.right.addRightNode(4)
node.right.right.right.addRightNode(5)
traversal(&node)
} // 遍历
func traversal(node *treeNode) {
if node == nil {
return
}
traversal(node.left)
traversal(node.right)
fmt.Println("名称", node.name)
} // 增加二叉树左节点
func addLeftNode(node *treeNode, value int) {
children := treeNode{name: fmt.Sprintf("子左节点->%s%d", "It干货栈", value)}
node.left = &children
} // 增加二叉树右节点
func (node *treeNode) addRightNode(value int) {
children := treeNode{
name: fmt.Sprint("子右节点->关注公众号", value),
left: nil,
right: nil,
}
node.right = &children
}

以上就是今天的分享了,如果你喜欢我的分享麻烦分享、转发或点击好看,我们下期再见,我是小栈君,拜了个拜~

go语言浅析二叉树的更多相关文章

  1. C语言实现二叉树-02版

    ---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那 ...

  2. C语言实现二叉树-利用二叉树统计单词数目

    昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...

  3. C语言实现二叉树

    二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会 ...

  4. C语言实现二叉树的基本操作

    二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...

  5. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  6. C语言数据库-二叉树

    一.定义 二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点.然而,没 ...

  7. c语言_二叉树的建立以及3种递归

    二叉树c语言的实现 二叉树的建立 二叉树的数据结构 typedef struct node{    int data;    struct node* left;    struct node* ri ...

  8. C语言实现二叉树-04版

    二叉树,通常应当是研究其他一些复杂的数据结构的基础.因此,通常我们应该精通它,而不是了解:当然,可能并不是每个人都认同这种观点,甚至有些人认为理解数据结构就行了!根本没有必要去研究如何实现,因为大多数 ...

  9. C语言实现二叉树-03版

    我们亲爱的项目经理真是有创意,他说你给我写得二叉树挺好的: 功能还算可以:插入节点,能够删除节点: 可是有时候我们只是需要查找树的某个节点是否存在: 所以我希望你能够给我一个find功能: 还有就是, ...

随机推荐

  1. 3.学习SpringMVC注解深入

    一.SpringMVC注解: 1.RequestParam注解: 其中required属性默认为true(必须得传而且传的名字一样),为false时可以不传. 编写jsp代码: <a href= ...

  2. Vue的SEO问题汇总

    方式一 思否 https://segmentfault.com/q/1010000011824706 SSR 和 Nuxt.js : https://zh.nuxtjs.org/ https://se ...

  3. Navicat自动断开连接处理方式

    问题描述 使用Navicat连接mysql后,如果一段时间不操作,那么会再次操作时会提示无响应,每次都这样确实折磨人,大大降低了工作效率! 问题解决 关闭连接→右键连接→连接属性 将上述心跳时间设置为 ...

  4. K8S集群搭建——基于CentOS 7系统

    环境准备集群数量此次使用3台CentOS 7系列机器,分别为7.3,7.4,7.5 节点名称 节点IPmaster 192.168.0.100node1 192.168.0.101node2 192. ...

  5. jmeter(四十六)参数化与断言实战

    概述 今天用jmeter做一次参数化实战.通过计数器遍历参数表,然后查询jdbc进行beanshell断言. 涉及元件 用户参数,计数器,正则表达式,jdbc,beanshell脚本 详细过程 在我们 ...

  6. 面试官问我:平常如何对你的 Java 程序进行调优?

    阅读本文大概需要 10 分钟. 作者:张俊城, 郭理勇, 刘建来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负 ...

  7. 灵活的MyBatis

    一.前言 将数据存储到数据库是开发中很重要的一环.曾经有程序员说自己做过最牛逼的事情就是增删改查.确实我们做了很多页面,后太代码写了很多,可是最终都离不开数据库的增删改查.Java有一套自己的JPA标 ...

  8. 【Alpha】“北航社团帮”小程序v1.0发布声明

    我们的"北航社团帮"小程序发布啦!!! Alpha版本功能 功能列表和详情图 模块 功能 登录 授权登录,游客模式,无需填写信息 活动展示 首页轮播热度最高的四个活动,查看活动详情 ...

  9. js正则判断字符串中是否包含特殊字符和空格

    字符串只能是数字.字母和中文组成,不能包含特殊符号和空格. /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/

  10. 【转】Android 将自己的应用改为系统应用

    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定.减少内存(DATA)空间占用.恢复出厂设置后不会消失.修改系统时间.调用隐藏方法.系统关机重启.静默安装升级卸载应用等 ...