基本概念
二叉树 是一种特殊的树,简单说每个结点 最多 有两个子树,且左右子树是有顺序的。
对于一棵具有
性质
- 在二叉树的第
层上至多有个结点()。 第一层只有 1 个结点; 第二层有个结点; 第三层有个结点; ...... 第层有个结点。
- 深度为
的二叉树至多有个结点()。 深度为的二叉树每一层最多结点数为, 令, 则有,,
- 对于任何一棵二叉树 T ,如果其终端结点数为
,度为 2的结点数为,则。 对于满二叉树这一性质很好证明:。 对于普通二叉树该怎么理解呢? 假设在层存在度为1的结点,则终端结点减少个,减少的度为2的结点数为,所以对于普通二叉树也满足该性质。
- 具有
个结点的完全二叉树的深度为。 对于完全二叉树来说,其结点数存在关系。因为深度为整数,故有,则,则可证。
- 如果对于一棵有
个结点的完全二叉树(其深度为)的结点按照层序编号(从第1层到第层,每层从左到右),对任一结点有:
- 如果
,则结点是二叉树的根,无双亲;如果,则其双亲是结点。
- 如果
,则结点无左孩子(结点为叶子结点);否则其左孩子是结点。
- 如果
,则结点无右孩子;否则其右孩子是结点。
- 如果
存储结构
顺序存储结构
由其结构特征可以得知:顺序结构多用于完全二叉树。
二叉链表
遍历方法
前序遍历
规则:根结点 -> 左结点 -> 右结点
中序遍历
规则:左结点 -> 根结点 -> 右结点
后序遍历
规则:左结点 -> 右结点 -> 根结点
层序遍历
这几种遍历方式都是将树中的结点转换为某种意义的线性序列,这会对程序的执行带来好处。
已知前序遍历序列和中序遍历序列,可以唯一确定一棵二叉树;
已知后序遍历序列和中序遍历序列,可以唯一确定一棵二叉树;
但是已知前序和后序遍历序列,是不可以唯一确定一棵二叉树的。
线索二叉树
线索二叉树原理
由图中可以发现该二叉树结构中存在很多空指针域。其中数目有多少呢? 假设二叉树中有
先看上图二叉树结构中的问题有什么呢?在遍历的过程中不知道结点的前驱和后继是哪一个结点。所以我们可以利用那些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱或后继结点的指针称为 线索,加上线索的二叉链表称为 线索链表,相应的二叉树就称为 线索二叉树(Threaded Binary Tree)。
上图为将二叉树中序遍历后,将所有空指针域中的rchild指向它的后继结点。
上图中将空指针域中的lchild指向它的前驱结点。 结合上面两张图可以看出:线索二叉树将二叉树转换为双向链表。 二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化。
这时候还有问题没有解决,仅凭上面的结构无法判断一个结点rchild/lchild内存储的是后继节点/前驱结点还是右孩子/左孩子。所以这时候引入区分标志:
所以,最终的结构为