二叉树的概念,以及先序遍历、中序遍历和后序遍历

在这里插入图片描述
先序遍历,中序遍历和后序遍历是二叉树遍历所有节点的三种顺序,这三个名词出现的次数还蛮多的。要理解这三种遍历顺序,首先要了解一下二叉树是如何构成的。

什么是二叉树

树,是一个由一个或多个节点所组成的一种数据结构。在树结构中,拥有一个树根节点和多个该节点派生出来的子树,每个子树中节点的排列顺序由其父节点决定。而二叉树,是指每个节点最多只能拥有两个子节点的树结构。
二叉树是一种重要的数据结构,基于二叉树可以高效地进行数据的查询和处理,二叉树的链接浪费率(n-1/n)是树结构中最低的,因此是使用率最高的树结构。在展开解释二叉树之前,让我们先了解一下二叉树中各种名词的含义。

二叉树的组成

根节点

在二叉树中,最顶部的那一个节点就是根节点。这个节点是二叉树创建时的第一个节点,后续节点的添加顺序都是以该节点作为参考标准的。比如上面这个二叉树,其中A就是根节点。

层数

层数是指二叉树被划分为了多少层。以上图为例,根节点A是第一层,B、C是第二层,D、E、F是第三层,G、H、I是第四层,共有四层。

高度

高度是指二叉树中的最高层数,上图一共有四层,因此二叉树高度为4。

二叉树中的度,是指某个节点共有多少个子节点。以上图为例,根节点A有两个子节点,其度数为2;节点B有一个子节点,其度数为1;节点G没有子节点,其度数为0。

叶节点

叶节点也叫树叶节点、终端节点,是二叉树中最底层的节点,该节点没有子节点,是其分支的最后一节。叶节点所处的层数不一定相同,比如节点E和节点I,分别处在第3层和第4层,但它们都是没有子节点的树叶节点。

非终端节点

非终端节点指的是具有子节点的节点。除了叶节点之外,其他的节点都是非终端节点,包括根节点。

子节点

子节点是相对于二叉树中上一个节点的称谓。以上图为例,节点B,C就是节点A的子节点。一个节点可以有多个子节点,也可以没有子节点。

父节点

与子节点相反,父节点是相对于二叉树中下一个节点的称谓。在图中,节点B是节点D的父节点。在二叉树中,每个节点只能有一个父节点,而根节点是没有父节点的。

祖先

在二叉树中,祖先的概念是指节点与其上层节点的关系。根节点是二叉树中所有其他节点的祖先,因为它处于二叉树的最上层。祖先的关系是根据层级和关联程度来判断的,而不是一一对应的关系。

子孙

子孙是节点与其下层节点的关系。在二叉树中的一个节点,与其有直接或间接联系,并且层级更低的节点,都是该节点的子孙。

兄弟节点

兄弟节点是指二叉树中具有相同父节点的节点。比如图中的节点B、C,就是兄弟节点。兄弟节点是处在同一层的。

同代

同代关系是指处于同一层的节点,而不一定是兄弟节点。譬如节点D、E、F,虽然父节点不同,但它们都处于第3层,因此都是同代关系。

森林

森林是指二叉树中去掉根节点后生成的多个二叉结构。

以上就是二叉树中常见的名词以及其概念了,明白了这些名词,我们就可以来了解二叉树的创建和遍历顺序了。

二叉树的创建

二叉树的创建,是将数据中的元素按照先后顺序来添加到数组或链表中来,并使其符合树结构的逻辑顺序。用一维数组创建的二叉树,查询更快捷,不存在的节点会存为空值,满二叉树结构会更节省空间;用链表创建的二叉树,添加和删除节点更方便,但父节点的查找会更麻烦。
二叉树的创建,是将数据的第一个元素设置为根节点,并将后续元素与其相比:比它小就为左子节点,比它大就为右子节点,然后在与下一层节点继续比较,直到找到合理且空缺的位置,并最终生成一个二叉树结构。
我以举例的方式,来解释一下将一串数据{6,4,8,5,3,2,9}创建为二叉树结构的过程。
首先,将数据中的第一个元素(6)放入二叉树中,作为其根节点;
之后,将第二个元素(4)与根节点相比较,其值小于6,因此被设置为6的左子节点;
之后,将第三个元素(8)与根节点比较,其值大于6,因此被设置为6的右节点;
之后,将第四个元素(5)与根节点相比较,其值小于6,然后向下与其左子节点比较,而5大于4,因此被设置为4的右节点;
之后,将第五个节点(3)与根节点相比较,其值小于6,然后向下与其左子节点比较,而3小于4,因此被设置为4的左节点;
之后,将第六个节点(2)与根节点相比较,其值小于6,然后向下与其左子节点比较,其值小于4,然后向下与其左子节点比较,而2小于3,因此被设置为4的左节点;
最后,将第七个元素(9)与根节点相比较,其值大于6,然后向下与其右子节点比较,而9大于8,因此被设置为8的右节点。
在这里插入图片描述
最后创建出来的二叉树结构是这样的。

这就是二叉树的创建过程,二叉树结构中的数据在创建时都是按照这个顺序来排列的。

说完了二叉树的创建,终于可以来介绍先序遍历,中序遍历和后续遍历了。先把这个图放在这,方便待会儿直接用。在这里插入图片描述

先序遍历

先序遍历的顺序是从根节点出发,先输出其根节点,再输出其左子节点,最后输出其右子节点。按照(根-左-右)的顺序将整个二叉树元素遍历一遍,并输出。
请添加图片描述
先序遍历比较好理解,先上后下,从左到右。根节点在首位。

中序遍历

中序遍历的顺序是从根节点出发,但是要先找其叶节点的左子节点,再找该左子节点的父节点,然后再找该父节点的右子节点。顺序是(左-根-右)。
请添加图片描述

中序遍历就绕了一点,先左再中后右,先下后上。根节点在中间位。

后序遍历

后序遍历的顺序是先找其叶节点的左子节点,从该节点开始,先找本节点有没有右节点,再找有没有左节点,最后再找其父节点。顺序是(左-右-根)。
请添加图片描述

后序遍历也比较绕,先右再左后中,先下后上。根节点在末尾。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值