网易首页 > 网易号 > 正文 申请入驻

【数据结构之二叉树】二叉树的相关概念及原理

0
分享至

作者:行小观 来源:二十二画程序员

前言

到目前为止,我们已经讲述了顺序表、链表、栈、队列四种数据结构,它们有一个共同的特点,就是它们都是线性表,换句话来说,它们都是线性结构,像一根绳子一样。

在文章【线性表】已经介绍过线性表的定义了,即由若干元素按照线性结构(一对一的关系)组成的有限序列。

关键词是一对一的关系

显然,在复杂的现实社会中,这种一对一的关系是不能较好地满足我们的需求的。

比如说,父母和多个孩子之间的关系,一个父亲/母亲对应多个孩子,这显然不是一对一,而是一对多的关系。那么此时我们如何来描述这种一对多的关系呢?

当然是使用具有一对多关系的数据结构啦!有这种数据结构吗?有!本文就来介绍这种数据结构 —— 树及其特殊形式的二叉树。

1. 识树

1.0. 什么是树?

提到树(Tree),大家脑海中首先浮出的画面应该是类似这样的:

之所以我们会用“树”这个名词来命名具有“一对多关系”特性的数据结构,是因为树刚好能够很形象地诠释这种特性。我们来分析一下。

看一下上图中的树(土地以上的部分),它有一个树根,从树根开始往上分叉,主树干分叉成许多次树干,次树干又继续分叉为许多小树枝,小树枝上有许多叶子……

主树干对次树干、次树干对小树枝、小树枝对叶子都是一对多的关系,我们用圆圈代表树干和叶子,把自然界的树倒过来进行一次抽象,得下图(为了方便起见,我们的数据全为字符类型):

可以看到,现实中的树完美契合我们需要的数据结构,所以我们称这种数据结构为树(Tree)。

1.1. 名词与概念

我们按图索骥,来认识树的相关名词。

子树:树是一个有限集合,子树则是该集合的子集。就像套娃一样,一棵树下面还包含着其子树。

比如,树T1 的子树为 树T2、T3、T4,树T2的子树为 T5、T6. 上图中还有许多子树没有标记出来。

结点(Node):一个结点包括一个数据元素和若干指向其子树分支。

比如,在树T1 中,结点A 包括一个数据元素A 和 三个指向其子树的分支。上图中共有 17 个结点。

根结点(Root):一颗树只有一个树根,这是常识。在数据结构中,“树根”即根节点。

比如,结点A 是树 T1 的根结点;结点C 是树T1 的子结点,是树 T3 的根结点。

度(Degree):一个结点拥有的子树数。

比如,结点A 的度为 3,结点G 的度为 3,结点H 的度为 1.

叶子(Leaf)/ 终端结点:度为 0 的结点被称为叶子结点,很形象吧。

比如,对于树 T1来说,结点F、I、K、L、M、N、O、P、Q 均为叶子。

分支结点 / 非终端结点:和叶子结点相对,即度不为 0 的结点。

内部结点:顾名思义,在树内部的结点,即不是根结点和叶子结点的结点。

孩子(Child)、双亲(Parent)、兄弟(Sibling)、堂兄弟、祖先、子孙这些概念和族谱上的相同。

比如,对于结点B 来说:结点A 是其双亲结点,结点E、F 是其孩子结点,结点C、D 是其兄弟结点,结点K 是其子孙结点。

层次(Level):从根结点开始,根为第一次,根的孩子为第二层,依次往下。

比如,结点K 在树 T1 中的层次为 4.

深度(Depth)/ 高度:指树的最大层次。

比如,树 T1 的深度为 4.

有序树:如果结点的各子树从左到右是有次序的、不能颠倒,则为有序树,否则为无序树。对于有序树的孩子来说,最左边的孩子称为第一个孩子,最右边的孩子称为最后一个孩子。

比如,如果树T1是一个有序树,则其根结点的第一个孩子为结点B,最后一个孩子为结点D.

1.2. 树的递归概念

前面已经介绍了树的轮廓和相关名词概念,为了回答什么是树这个问题,我们这里还需要介绍三种常见的树结构。

【空树】:一棵空树,即没有结点的树。

【只有根结点的树】:只有一个根结点,没有其他结点。

【普通的树】

现在我们能来回答什么是树了:

(Tree)是由 N (N >= 0) 个结点构成的有限集合。

  • 当 N = 0 时,树为空树
  • 当 N = 1 时,树只有一个根结点
  • 当 N > 1 时,树除了一个根结点外,其余结点又可分为若干个不相交的有限集合,我们称之为子树。

非空树有且仅有一个根结点。

树的一对多的关系存在于双亲结点和孩子结点之间。

在树中,因为存在树、子树的概念,所以树的子树仍是一颗树,子树的子树仍是一棵树。

  • 举个例子:人类的孩子仍是人类,人类的孩子的孩子仍是人类。

因为存在双亲、孩子、子孙的概念,所以根结点的孩子结点可以其子树的根结点。

  • 举个例子:一个人,在其孩子看来是父亲,在其父母看来是儿子。

这种概念,就是递归的概念。

即,对于某个“事物”而言,它的“孩子”和它本身并无实质区别,它做的事,它的“孩子”也会做、也要做。一直向下,“孙子”“曾孙”“玄孙”皆是如此。

为了说明递归这个概念,我们将上图的树递归地分解为子树,下图中每个区域都是一颗树(或子树):

分解到最后,我们最终得到的,可以说是叶子结点,也可以说是只有根结点的树。如结点F、K、L.

在分解的过程中,我们还可以发现,对于每个结点来说,我们都可以将其看作某棵树(子树)的根结点。比如结点E、I都是某棵子树的根结点。这与树有且只有一个根结点并不矛盾

  • 这就好比我们说,小明只能有一个亲生父亲,但不影响他成为别人的父亲。

整个过程就像在族谱上从祖宗找到子孙一样。所以如果对树的概念有啥不了解的,可以找个族谱翻翻看。

到此,我们可以说,树的定义是一个递归的定义,树是由根结点和它的若干子树组成的,子树也是由根结点和它的若干子树组成的……即在树的定义中又用到树的定义。

1.3. 树和线性表的比较

看图直观体验何为(前驱结点和后继结点间)一对一的关系,何为(双亲结点和孩子结点之间)一对多的关系。

2. 识二叉树

2.0. 什么是二叉树?

何为二叉树?首先它得是棵树,其次它得是二叉的。

前面已经初步认识了树,它的结点的孩子数量是没有限制的,即,你想要几个孩子就要几个孩子,想分几个叉就分几个叉。

而二叉树,则是限制了孩子数量,即每个结点最多只能有两个孩子(左孩子和右孩子),打个比方就是“二胎树”。

结点A 的左孩子是结点B,右孩子是结点C.

二叉树是一种每个结点至多有两棵子树(即每个结点的度最大为 2 )的有序树。

2.1. 二叉树的几种形态

一、空二叉树

二、仅有根结点的二叉树

三、左子树为空的二叉树

四、右子树为空的二叉树

五、左右子树都不为空的二叉树

2.2. 满二叉树和完全二叉树

满二叉树的特点在于“满”,即每层的结点数都是最大结点数。

T2 的第 3 层次没有达到最大结点数,缺了 1 个;T3 的第 4 层次没有达到最大结点数,缺了 7 个。

完全二叉树是相对于满二叉树来说的,见下图:

二叉树是有序树,对一颗满二叉树和一颗完全二叉树按「自上向下,自左向右」的顺序进行编号,如上图。

完全二叉树中的所有结点的编号必须和满二叉树的相同编号的结点在位置上完全相同

换句话说,完全二叉树的结点按「自上向下,自左向右」的顺序不能中断。T3 的结点C 没有左孩子,显然按那个顺序是中断的。

3. 二叉树的遍历

3.0. 如何遍历?

在线性表中,我们的遍历非常简单粗暴,找到线性表头,使用循环直接一股脑的到线性表尾,即完成遍历了。在树中,我们不能再做这么简单粗暴的事了,因为树是一对多的关系,所以从头到尾的遍历是不可能的。

遍历的实质是,将线性排列的元素顺序打印出来。(遍历不止干打印的事,为了方便起见,我们的遍历是打印元素)

而遍历树的矛盾在于,我们的树不是线性的,为了解决这个矛盾,我们可不可以约定好某种顺序,将树的元素按这种顺序线性排列起来,然后遍历就是从头到尾的简单粗暴之事了?答案是可以的。

我们知道树是递归的定义,二叉树是由根结点、左子树、右子树这三部分递归地组合而成的。 所以我们要约定的就是这三部分谁先谁后。

按照人们写字先左后右的约定,我们也约定先左子树后右子树的顺序(当然你可以先右后左),那么根结点就只有三个位置可以放了。

根结点 >> 左子树 >> 右子树,称为先序(根)遍历

左子树 >> 根结点 >> 右子树,称为中序(根)遍历

左子树 >> 右子树 >> 根结点,称为后序(根)遍历

约定好之后,只需要按照顺序递归地来就好了,就像找族谱一样。

下面以遍历下图二叉树为例:

为了方便起见,我们将 null 画出来,且将所有子树用颜色标志出来。

3.1. 先序遍历

先序遍历的递归描述如下:

若二叉树为空,则空操作;否则:

  1. 访问根结点
  2. 先序遍历左子树
  3. 先序遍历右子树

你可能会问,怎么只有访问根结点这一步?左孩子和右孩子结点呢?前面说过一句话:对于每个结点来说,我们都可以将其看作某棵树(子树)的根结点。就像你的儿子会成为别人的父亲一样。所以只要递归地访问根结点,将每个结点递归地变为“根结点”,我们就能完成遍历。

所以与其说是在遍历结点,不如说是在遍历「根结点」,我们只是在递归地把「所有根结点」找出来并输出而已。(因为每个结点都可以看做是根结点)

所以遍历的重点,在于将所有结点转化为根结点看待,又因为每棵树有且仅有一个根结点,所以我们要不断地递归分解子树(先左子树后右子树),直到分解到 NULL为止。

过程如下:

先序遍历的顺序为:A B D E G C F

如果你感觉文字描述不直观,可以在我以前写过的文章中找到二叉树遍历过程的动态图[1]。

3.2. 中序遍历

中序遍历的递归描述如下:

若二叉树为空,则空操作;否则:

中序遍历左子树

访问根结点

中序遍历右子树

过程如下:

中序遍历的顺序为:D B G E A C F

3.3. 后序遍历

后序遍历的递归描述如下:

若二叉树为空,则空操作;否则:

  1. 后序遍历左子树
  2. 后序遍历右子树
  3. 访问根结点

过程不再描述,后序遍历的顺序为:D G E B F C A

4. 总结

概念和原理是进行实践的基础,如果这些不了解,那么代码实现就无从下手。

二叉树的概念和原理先介绍到这里。

参考资料

[1]二叉树遍历过程的动态图:

https://blog.csdn.net/m0_47335900/article/details/106157797

[2]GitHub:

https://github.com/xingrenguanxue/Simple-DS-and-Easy-Algo

[3]Gitee:

https://gitee.com/xingrenguanxue/Simple-DS-and-Easy-Algo

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
篮板完全被爆!中国U17全场仅28个篮板&埃及则是49个

篮板完全被爆!中国U17全场仅28个篮板&埃及则是49个

直播吧
2024-07-05 18:47:12
中金轻生小姐姐曾手握7个签证到访11个国家,典型美女学霸。

中金轻生小姐姐曾手握7个签证到访11个国家,典型美女学霸。

人情皆文史
2024-07-04 02:57:44
上海96岁老伯因身体原因放弃驾考,教练:活到老学到老的精神值得点赞

上海96岁老伯因身体原因放弃驾考,教练:活到老学到老的精神值得点赞

澎湃新闻
2024-07-03 11:50:28
统一时机已到!国防部下最后“通牒”,美方吓破胆,连夜打来电话

统一时机已到!国防部下最后“通牒”,美方吓破胆,连夜打来电话

文雅笔墨
2024-07-03 18:30:13
中国旅游杀疯了,外国游客:中国重新定义了发达和现代化的标准!

中国旅游杀疯了,外国游客:中国重新定义了发达和现代化的标准!

布拉旅游说
2024-07-04 21:11:02
对外招生广告:成绩差就来中国留学,全免费,奖学金能养活全家

对外招生广告:成绩差就来中国留学,全免费,奖学金能养活全家

大风文字
2024-07-03 11:05:28
让北宋头痛不已的“契丹”,是现在的哪个民族?说出来你可能不信

让北宋头痛不已的“契丹”,是现在的哪个民族?说出来你可能不信

历史文社
2024-07-04 19:34:57
刘亦菲的素颜状态,够真实!

刘亦菲的素颜状态,够真实!

视点历史
2024-07-03 22:22:26
吃牛排时,为何旁边都放一个溏心蛋,不懂别随便吃,免得闹笑话

吃牛排时,为何旁边都放一个溏心蛋,不懂别随便吃,免得闹笑话

华庭讲美食
2024-07-01 13:30:44
汪文斌任中国驻柬埔寨大使

汪文斌任中国驻柬埔寨大使

新京报
2024-07-05 23:34:14
山西介休市监局工作人员撕毁群众办事材料,局长:已批评并处理

山西介休市监局工作人员撕毁群众办事材料,局长:已批评并处理

新京报
2024-07-05 16:16:08
豪华车“疯狂”降价,奔驰和捷豹路虎最高降幅达50%

豪华车“疯狂”降价,奔驰和捷豹路虎最高降幅达50%

第一电动网
2024-07-03 10:26:08
瑞典首相:欧尔班访问莫斯科是对乌克兰人民的侮辱

瑞典首相:欧尔班访问莫斯科是对乌克兰人民的侮辱

桂系007
2024-07-05 23:40:27
湖人和詹姆斯在2024年自由球员市场上,找不到球星联手的5个原因

湖人和詹姆斯在2024年自由球员市场上,找不到球星联手的5个原因

阿雄侃篮球
2024-07-05 23:44:15
司机从陕西到西藏2700公里,运送33吨火腿肠,1.9万运费因“运损”要被扣光?

司机从陕西到西藏2700公里,运送33吨火腿肠,1.9万运费因“运损”要被扣光?

陕西吃喝玩乐
2024-07-04 11:51:25
灾区求捐赠,无人响应,企业捐钱数变少,明星保持沉默也不带头了

灾区求捐赠,无人响应,企业捐钱数变少,明星保持沉默也不带头了

芯怡飞
2024-07-04 13:00:43
34岁鹿晗被偶遇,身形消瘦佝偻着腰,一头金发被嘲像尹正

34岁鹿晗被偶遇,身形消瘦佝偻着腰,一头金发被嘲像尹正

木子爱娱乐大号
2024-07-04 18:00:01
谁灭了普里戈金?

谁灭了普里戈金?

瓜哥的动物日记
2024-07-05 15:57:01
梁晓声:饥饿年代的中国女性

梁晓声:饥饿年代的中国女性

霹雳炮
2024-05-03 23:21:38
10年,江苏女老师见一学生像前夫,鉴定发现,竟是17年前死去的儿子

10年,江苏女老师见一学生像前夫,鉴定发现,竟是17年前死去的儿子

潮河讲堂
2024-07-02 16:49:48
2024-07-06 01:16:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 824关注度
往期回顾 全部

科技要闻

当全球AI界的镁光灯向东方聚焦

头条要闻

汪文斌任中国驻柬埔寨大使

头条要闻

汪文斌任中国驻柬埔寨大使

体育要闻

不想大破大立的太阳 小修小补有用吗

娱乐要闻

49岁林志玲在日本带娃被偶遇

财经要闻

李迅雷建议每年发5万亿国债十年50万亿

汽车要闻

银河E5 能否一战?

态度原创

健康
教育
房产
游戏
军事航空

人类为何至今无法攻克渐冻症?

教育要闻

从中考失利到高考逆袭,不只是努力,还有这些秘诀!

房产要闻

2024上海楼市半年报:市场后程发力,政策效应或将持续

奢侈品安排?原神与法国娇兰联动,新角色排场太大了

军事要闻

普京称俄将镜像美中短程导弹部署

无障碍浏览 进入关怀版