二叉树的性质
性质1
:
- 在二叉树的第 i 层上至多有 2 i-1 个结点(i >= 1)。
- 证明:利用归纳法证明此性质。
- 第 i 层上至少也应该有 1 个结点,如果是 0 个结点的话那就没有这一层了。
性质2
:
- 深度为 k (这棵二叉树有k层)的二叉树至多 有 2k - 1 个结点(k >= 1)。
- 证明:由性质 1 可知,深度为 k 的二叉树的最大结点数为:将每一层的结点全部加起来。
- 深度为 k 的二叉树至少有 k 个结点,每层至少得有1个结点。
性质3
:
- 对任何一个二叉树 T ,如果其终端结点数(叶子数)为 n0,度为2的结点树为 n2,则 n0 = n₂ + 1。
- 如:下图有7 8 9 10 11 12这 6 个叶子结点,度为 2(有2个分支)的结点则有12345 这5个,所以叶子结点的数量 = 度为2的结点数+1,6=5+1
- 证明:
- 从下往上看:所有的结点都和它的双亲有一条边连着(除了根结点),设B为分支总数,所以分支总是=结点总数-根结点B = n - 1。
- 从上往下看:每个度为2的结点都会产生两条边,度为1的结点则产生1条边,剩余的叶子结点因为没有分支,所以不产生边,所以总边数为:度为2的结点数2+度为1的结点1,B = n₂ * 2 + n₁ * 1。
- 同一棵二叉树的边的个数应该是相等的,所以,不管从上往下看还是从下往上看的结果应该相等
满二叉树和完全二叉树
这两种二叉树在顺序存储的方式下可以复原!
满二叉树
一颗深度为 k 且含有 2 k-1个结点的二叉树称为满二叉树,顾名思义,一个二叉树中的所有结点都存在。
如:这棵满二叉树就有 2 4-1 = 15个结点
特点
:
- 每一层上的结点树都是最大结点数(每层都满)。
- 叶子结点全部在最底层
对满二叉树结点位置进行编号
- 编号规则:从根结点开始,自上而下,自左而右
- 每一个结点位置都存放有元素。
完全二叉树
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
深度为 K 的具有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号
为 1~n的结点一一对应时,称之为完全二叉树
。
如:下图的 完全二叉树 的 全部编号 都能在 满二叉树 当中找到,编号123456的位置,都能在满二叉树的对应位置上找到。
非完全二叉树
非完全二叉树就不是所有的编号都能在满二叉树对应的位置上找到了。如下图:非完全二叉树编号为6的结点就不能再满二叉树中编号为6的位置上找到了。
判断下图中的二叉树是否是完全二叉树
更好的完全二叉树判别方法
- 在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一颗完全二叉树,
一定是连续的去掉
。
完全二叉树的特点
- 叶子只可能分布在层次最大的两层上(叶子只会在最后1层或导数第二层)。
- 对任一结点,如果其右子树的最大层次为 i ,则其左子树的最大层次必为 i 或 i + 1.
完全二叉树的性质
性质4
证明:
性质5
如果对一棵有 n 个结点的完全二叉树(深度为𠃊log₂n𠃎 + 1)的结点按层序编号(从第一层到𠃊log₂n𠃎 + 1层,每层从左到右),则队==任一结点 i ==(1 <= i <= n),有:
- 如果 i = 1,则结点 i 是二叉树的根,无双亲;如果 i > 1,则其==双亲是结点𠃊 i / 2 𠃎 ==。
- 如果 2i > n,则结点 i 为叶子结点,无左孩子了否则,其左孩子是结点 2i。
- 如果 2i + 1 > n,则结点 i 无右孩子;否则其右孩子是结点 2i + 1。
性质5表明了完全二叉树中双亲结点编号与-孩子结点编号之间的关系。
二叉树的存储结构
二叉树的顺序存储结构
实现
:
- 按照满二叉树的结点层次编号,依次存放二叉树中的数据元素。
- 每个结点的编号就作为数组的下标,根据结点编号存放在数组中。
- 如:根节点的编号就是 0,然后按照自上而下,自左而右的顺序依次排号。
类型定义
定义一个最大空间为100字节的数组,
如果有一棵如下图所示的二叉树,该如何存储?
- 依然是按照满二叉树的方式排号,那些没有元素的结点也要空出来,将这些没有元素的空结点在数组中就以 0 的形式存储。
- 如果不这样存,而是以 abcdefg 的形式存储,那这不就成了满二叉树了嘛。
【例】:二叉树结点数值采用顺序存储结构,如图所示,画出二叉树。
只要知道一颗满二叉树的编号是多少,然后将对应位置的结点扣掉就行了。
二叉树的顺序存储缺点
- 顺序存储共有的一个缺点就是存储元素的数组大小是固定的。
- 加入树中的元素个数变化很大时,这时还用定长的数组存储就不够灵活了。
- 当树中有空结点的时候,这些空结点依然要占用数组的空间,浪费空间。
最坏的情况就如下图所示,这样一棵右单支树的空间利用率就相当低了,为了存储这样一棵树,需要7个元素的数组。右单支树的层数越高,越浪费空间。
二叉树顺序存储的特点
- 结点空间关系蕴含在其存储位置中。
- 浪费空间,适合于存储满二叉树和完全二叉树。
二叉树的链式存储结构
- 由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成。
- 则表示二叉树的链表中的结点至少包含三个域:数据域和左、右指针域,左、右指针分别指向左、右孩子,如果要经常操作结点的左右孩子,就使用这种存储结构。
含有两个指针域的结点结构的定义
二叉链表
- 二叉链表有两个指针域,一个指向左孩子,另一个指向右孩子。
- 用一个头指针指向整棵二叉树的根结点 A,
- 没有孩子的那一边的指针域置为 NULL。
- 如:A 结点没有右孩子,所以将A结点的右指针域置为NULL,其他结点同理。
单支树的二叉链表
- 每个结点都只有左或右孩子二叉树称为单支树,同理这样的链表就称为单支树的二叉链表。
- 如:左单支树的二叉链表,因为每个结点都没有右孩子,所以每个结点的右指针域都为NULL,
总结规律
- 在有 n 个结点的二叉链表中,有 n + 1个空指针域。
- 分析:必定有 2n 个链域。
- 除根节点之外,每个结点有且仅有一个双亲,所以只会有 n - 1个结点的链域用来存放指针,指向非空子女结点。
三叉链表
- 有时,为了便于找到结点的双亲,还可以在结点结构中增加一个指向其双亲结点的指针域。
- 和二叉链表有两个指针域类似,有三个指针域的链表称为三叉链表,分别指向左、右孩子,以及双亲。
只有根结点的双亲域为空,其余结点一定会有双亲。