二叉树
1.二叉树的定义
\quad \quad 二叉树是n(n>=0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
2.二叉树的特点
- 每个结点最多有两棵子树;所以二叉树中不存在度大于2的结点
- 二叉树是有序的,其次序不能颠倒。左子树与右子树都是有顺序的,次序不能任意颠倒;
- 即使树中某结点只有一颗子树,也要区分它是左子树还是右子树。
3.二叉树的基本形态
1.空二叉树
2.只有一个根结点
3.根结点只有左子树
4.根结点只有右子树
5.根结点既有左子树又有右子树
二叉树和树是两种树结构。
具有三个结点的树的形态只有两个,而具有三个结点的二叉树的形态有五个。
4.特殊的二叉树
4.1 斜树
- 所有结点都只有左子树的二叉树称为左斜树
- 所有结点都只有右子树的二叉树称为右斜树
斜树的特点:
1.在斜树中,每一层只有一个结点;
2.斜树的结点个数与其深度相同。
4.2 满二叉树
\quad \quad
在一棵二叉树中,如果所有分支结点都存在左子树与右子树,并且所有叶子都在同一层上。则此二叉树为满二叉树
满二叉树的特点:
1.叶子结点只能出现在最下一层。
2.只有度为0和度为2的结点。
3.满二叉树在同样深度的二叉树中结点个数最多
4.满二叉树在同样深度的二叉树中叶子结点个数最多
4.3 完全二叉树
\quad \quad
对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。则此二叉树为完全二叉树。
完全二叉树的特点:
1.叶子结点只能出现在最下两层且最下层的叶子结点都集中在二叉树的左面。
2.完全二叉树中如果有度为1的结点,且可能有一个,且该结点只有左孩子。
3.深度为K的完全二叉树在K-1层上一定是完全二叉树。
4.在同样结点个数的二叉树中,完全二叉树的深度最小。
5.二叉树的基本性质
性质1
\quad \quad 二叉树的第i层上最多有 2 ( i − 1 ) 2^{(i-1)} 2(i−1)个结点。
性质2
\quad \quad 一棵深度为k的二叉树中,最多有 2 k − 1 2^k-1 2k−1个结点,最少有k个结点。
\quad \quad 深度为K且具有 2 k − 1 2^k-1 2k−1个结点的二叉树一定是满二叉树。
\quad \quad 深度为K且具有k个结点的二叉树不一定是斜树。
性质3
\quad \quad 在一棵二叉树中,如果叶子结点树为 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,则有: n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
性质4
\quad \quad 具有n个结点的 完全二叉树 的深度为 l o g 2 n log_2n log2n+1。
性质5
在完全二叉树中,结点的层序编号反映了结点之间的逻辑关系。
6.二叉树的存储结构
6.1 二叉树的顺序存储结构
\quad \quad 二叉树的顺序存储结构就是用一维数组存储存储二叉树中的结点,并且结点的存储位置 (下标)应能体现结点之间的逻辑关系——父子关系
完全二叉树的顺序存储
如果编程语言索引是从01开始的,编号i的结点存储在i-1的位置上
一般二叉树的顺序存储
\quad \quad
不存在的结点位置设置为空
\quad \quad 深度为K的右斜树,K个结点需分配 2 k − 1 2^k-1 2k−1个存储单元,极度浪费空间。
\quad \quad 一棵二叉树改造成完全二叉树形态,需增加很多空结点,造成存储空间的浪费。
因此,二叉树的顺序存储结构一般仅存储完全二叉树。
6.2 二叉树的链式存储结构
\quad \quad 二叉树的链式存储结构,即二叉链表
基本思想
\quad \quad 令二叉树的每个结点对应一个链表结点,链表结点除了存放与二叉树有关的数据信息之外,还要设置指示左右孩子的指针。
结点结构:
例子:
\quad \quad
具有n个结点的二叉链表中,共有n+1个空指针。
\quad \quad
在二叉链表中,不容易找结点的双亲,可通过三叉链表寻找双亲。
三叉链表:
\quad \quad
在二叉链表的基础上增加一个指向双亲的指针域。
\quad \quad
三叉链表可以很快的找到孩子结点以及双亲
三叉链表的静态链表形式
优点:
- 节省存储空间
- 搜索结点时,比较方便
缺点:
- 不适合用于频繁插入和删除的场合