前言
二叉树可用于实现二叉查找树和二叉堆,二叉树主要应用在以二叉树为基础的各种数据结构上。在计算机科学中,二叉树是每个结点
最多有两个子树
的树结构,树形结构在计算机中应用非常广,例如文件系统就是依靠树形结构实现的,我们先来介绍树的概念及结构:
树是什么(计算机科学)
概念解释
在数据结构中,树是一种非线性的数据结构,它是由n(n>=0)个有限节点组合成的一个具有层次关系的集合。因为在逻辑结构上,它像一颗倒挂起来的树,是一颗根朝上,叶朝下的树形数据结构。
树的定义类似于递归
根节点,没有前驱节点就像是族谱中祖宗
除根节点外,其余节点被分为M个(M>0)个互不相交的集合T1、T2、…Tm,这些叫做子树。每棵子树的根节点有且只有一个前驱,可以有0或多个后继节点
相关必备概念补充
节点的度: 一个节点含有的子树的个数;如A的为3,B的为2
叶节点(终端节点):度为0的节点称为叶节点;如F、G、I、J为叶节点
分支节点(非终端节点):度不为0的节点;
父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如A是B的父节点
子节点:一个节点含有的子树的根节点称为该节点的子节点;如B是A的子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点;如B、C、D是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度;如树的度为3
节点的层:从根节点开始定义,根为第1层,根的子节点为第2层,以此类推
树的高度(深度):树中节点的最大层次;如上图树的深度为4
节点的祖先:根节点
子孙:以某节点为根的子树中任一节点都称为该节点的子孙;如所有节点都是A节点的子孙
森林:由m(m>0)课互不相干的树的集合构成森林
树的代码实现
以最常用的孩子兄弟表示法展示
typedef int DataType; struct Node { struct Node* _firstChild1; // 第一个孩子结点 struct Node* _pNextBrother; // 指向其下一个兄弟结点 DataType _data; // 结点中的数据域 };
图示:
二叉树
概念解释
树中节点最大的度,为2的数就叫做二叉树,也就是树的度为2的树
①在二叉树中,一个节点最多有两颗子树,二叉树节点的度<=2
②二叉树的有左右之分,且子树的次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的
二叉树的两种特殊形式
满二叉树
:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。完全二叉树
:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对- 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
图示:
相关性质
若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2 ( i − 1 ) 2^(i-1)2
(
i−1)个结点.
若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h -12
h
−1
对任何一棵二叉树, 如果度为0其叶结点个数为n 0 n_0n
0
, 度为2的分支结点个数为n 2 n_2n
2
,则有n 0 n_0n
0
=n 2 n_2n
2
+1
若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=l o g 2 log_2log
2
(n+1). (ps:l o g 2 log_2log
2
(n+1) 是log以2为底,n+1为对数)
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
- 于序号为i的结点有:
1.
若i>0,i位置节点的双亲序号
:(i-1)/2;i=0,i为根节点编号,无双亲节点2.
若2i+1<n,左孩子序号
:2i+1,2i+1>=n否则无左孩子3.
若2i+2<n,右孩子序号
:2i+2,2i+2>=n否则无右孩子
二叉树的实现方式
二叉树一般可以使用两种结构存储,一种
顺序结构
,一种链式结构
。
顺序存储
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。
本节完