二叉树的定义以及遍历
二叉树的定义以及遍历
在学习过程中带着问题去思考,这样往往会达到事半功倍的效果。现在有这样一个问题:二叉树的前序遍历为EFHIGJK,中序遍历为HFIEJKG,按照后序遍历和层序遍历的结果是多少?
为了解决这个问题,我们先看下什么是二叉树以及二叉树是如何遍历的?
一、什么是二叉树
1. 定义
简单理解下:
1)本身是有序树;
2)树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2
2. 二叉树的类型
2.1 满二叉树
如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
2.2 完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
2.3 非完全二叉树
如下图:由于最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。
二. 二叉树的遍历
1. 几个相关概念
二叉树的遍历涉及到两个关键点:访问和次序
度:二叉树中,节点的度指的是节点拥有的子树的数目。而整棵树的度指的是树中结点的最大的度。
根节点:二叉树只有一个根节点,树最顶端的节点就是根节点
分支节点:也称为非终端节点,度不为零的节点称为非终端节点
叶子节点:也称为终端节点,没有子树的节点或者度为零的节点
2. 遍历
2.1 前序遍历
顺序是:根左右(根在最前面),考察到一个分支节点,即刻输出该节点的值,并继续遍历其左右子树
说明:每一层都要按照分支节点在前面位置来进行遍历
2.2 中序遍历
顺序是: 左根右(根在中间),考察到一个分支节点,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树
说明:按照分支节点在中间位置来进行遍历
2.3 后序遍历
顺序是: 左右根(根在最后面),考察到一个分支节点,将其暂存,遍历完左右子树后,再输出该节点的值。
说明:按照分支节点在后面位置来进行遍历
2.4 层序遍历
这种遍历方式比较简单:从上往下,从左到右
说明:上面几种遍历方式中,这个根指的是每一层遍历时的分支节点,当然根节点只有一个,根据先序、中序、后序来放置在最前面、中间、最后面
现在我们再来看下:
1)由前序遍历结果EFHIGJK,可以得出 E 是根节点
2)由中序遍历结果HFIEJKG,可以得出HFI是左子树的节点,JKG是右子树的节点
3)我们再来看前序遍历结果EFHIGJK,由第2点的分析,将其进行分割为 E,FHI,GJK
4)由前序遍历的特点是根左右,那么可以得出 F 和 G 是第二层的根节点
5)分析左子树:
根左右:FHI
左根右:HFI
可以得出 H 是F下一层的左边子节点,I 是F下一层的右边子节点
6) 分析右子树:
根左右:GJK
左根右:JKG
由于前面已经推导出 G 是根节点,由中序遍历结果:JKG,可得知 G的右边是没有子节点的,JK 作为一个整体在G的左边,再由前序遍历结果:GJK,可推导出 J 是G的左边子节点。
由中序遍历结果:JKG,J是分支节点,那么根据左根右的特点,可得知 G的左边是没有子节点的,进而推导出 K是 J 的右边子节点。
推导完毕,现在我们可以得出
后序遍历的结果为: HIFKJGE
层序遍历的结果为: EFGHIJK
说明:因为二叉树的遍历是根据根节点的位置遍历的,因此推导过程中,我们是先判断出根/分支节点的问题,然后再去推导其他节点的位置,