二叉树的定义以及遍历
二叉树的定义以及遍历
在学习过程中带着问题去思考,这样往往会达到事半功倍的效果。现在有这样一个问题:二叉树的前序遍历为EFHIGJK,中序遍历为HFIEJKG,按照后序遍历和层序遍历的结果是多少?
为了解决这个问题,我们先看下什么是二叉树以及二叉树是如何遍历的?
一、什么是二叉树
1. 定义
简单理解下:
1)本身是有序树;
2)树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2
2. 二叉树的类型
2.1 满二叉树
如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
2.2 完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
2.3 非完全二叉树
如下图:由于最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。
二. 二叉树的遍历
1. 几个相关概念
二叉树的遍历涉及到两个关键点:访问和次序
度:二叉树中,节点的度指的是节点拥有的子树的数目。而整棵树的度指的是树中结点的最大的度。
根节点:二叉树只有一个根节点,树最顶端的节点就是根节点
分支节点:也称为非终端节点,度不为零的节点称为非终端节点
叶子节点:也称为终端节点,没有子树的节点或者度为零的节点
2. 二叉树的遍历有什么特殊之处?
在计算机程序中,遍历本身是一个线性操作。所以遍历同样具有线性结构的数组或链表,是一件轻而易举的事情。
反观二叉树,是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同。
3. 二叉树的遍历方式
顺序是:根左右(根在最前面),考察到一个分支节点,即刻输出该节点的值,并继续遍历其左右子树
说明:每一层都要按照分支节点在前面位置来进行遍历
1)中序遍历
顺序是: 左根右(根在中间),考察到一个分支节点,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树
说明:按照分支节点在中间位置来进行遍历
2)后序遍历
顺序是: 左右根(根在最后面),考察到一个分支节点,将其暂存,遍历完左右子树后,再输出该节点的值。
说明:按照分支节点在后面位置来进行遍历
3)层序遍历
这种遍历方式比较简单:从上往下,从左到右
说明:上面几种遍历方式中,这个根指的是每一层遍历时的分支节点,当然根节点只有一个,根据先序、中序、后序来放置在最前面、中间、最后面
现在我们再来看下:
- 由前序遍历结果EFHIGJK,可以得出 E 是根节点
- 由中序遍历结果HFIEJKG,可以得出HFI是左子树的节点,JKG是右子树的节点
- 我们再来看前序遍历结果EFHIGJK,由第2点的分析,将其进行分割为 E,FHI,GJK
- 由前序遍历的特点是根左右,那么可以得出 F 和 G 是第二层的中间节点
- 再回到中序遍历结果:HFIEJKG
分析左子树
由于HFI是一个整体,F是中间节点,可以得出 H 是F下一层的左边子节点,I 是F下一层的右边子节点。
如下图:
6) 分析右子树:
由于前面已经推导出 G 是中间节点,由中序遍历结果:HFIEJKG,可以推导出JK构成了G的左子树。
再下沉一级,来看前序遍历中的结果EFHIGJK。将JK看做一个整体,那么J是中间节点,再回到中序遍历结果HFIEJKG来判断范围,K在J的右侧。
可以推导出如下图:
推导完毕,现在我们可以得出
后序遍历的结果为: HIFKJGE
层序遍历的结果为: EFGHIJK
三、总结
因为二叉树的遍历首先是根据根节点的位置遍历的,因此推导过程中主要注意这两点:
1. 首要步骤是通过前序/后序遍历结果推导出根节点
2. 再通过中序遍历划分节点范围,然后再根据前序/后序遍历结果去推导其他节点的位置。如果还有下一层级就继续按照刚才逻辑推导。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)