二叉树的定义:
➢每个结点的度均不超过2的有序树,称为二叉树( binary tree )。
➢与树的递归定义类似,二叉树的递归定义如下:二叉树或者是一棵空树,或者是一-棵由一个根结点和两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树。
二叉树的性质:
➢在二叉树的第i层上最多有2^i个结点。
➢高度为h的二叉树至多有2^(h+1)-1个结点。
➢对任何一棵二-叉树T ,如果其终端结点数为n0 ,度为2的结点数为n2 ,则n0= n2+ 1
- 总节点数n=度数+1=1n1+2n2 +1
- 总节点数n=n1+n0+n2->n0=n2+1
➢有n个结点的完全二叉树的高度为l logn」(向下取整)
➢含有n≥1个结点的二叉树的高度至多为n-1 ;高度至少为
l logn」(向下取整)
➢如果对一棵有n个结点的完全二叉树的结点进行编号,则对任一结点i(1≤i≤n) ,有:
- (1) 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲结点PARENT(i) 是结点[ i/2」(向下取整)。
- (2) 如果2i>n,则结点i无左孩子;否则其左孩子是结卢。
- (3) 如果2i+1>n, 则结点i无右孩子;否则其右孩子是结点2i+1。
注意:以上性质中的高度都是从0开始计算的。
满二叉树:
➢高度为k并且有2^(k+1)-1个结点的二叉树。在满二叉树中,每层结点都达到最大数,即每层结点都是满的,因此称为满二叉树。
完全二叉树:
➢若在一棵满二叉树中,在最下层从最右侧起去掉相邻的若干叶子结点,得到的二叉树即为完全二叉树。
二叉查找树:
➢所谓二叉查找树( binary searchtree, BST )或者是一棵空树;或者是具有以下性质的二叉树:
- (1) 若它的左子树不空,则其左子树中所有结点的值不大于根结点的值;
- (2)若它的右子树不空,则其右子树中所有结点的值不小于根结点的值;
- (3) 它的左、右子树都是二叉查找树
➢结论:中序遍历一棵二叉查找树可以得到一个按关键字递增的有序序列。
平衡二叉树(AVL):
➢在二叉树中,任何一个结点v的平衡因子都定义为其左、右子树的高度差。注意,空树的高度定义为-1。
➢在二叉查找树T中,若所有结点的平衡因子的绝对值均不超过1,则称T为一棵AVL树。
红黑树(EBT,要求比较宽松的平衡树)
红黑树需要满足如下要求:
- 节点都有颜色标记,且只能是红色或黑色。
- 根是黑色。
- 所有叶子都是黑色(叶子是NIL/ill_节点,不保存实际的数据)。
- .每个红色节点必须有两个黑色的子节点,也可以表述为从每个叶子到根的所有路径上不能有两个连续的红色节点。
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
B树:
B-tree树即B树,B即Balanced,平衡的意思。有人把B-tree翻译成B-树,容易让人产生误解。会以为B-树是一种树,而B树又是另-种树。实际上,B-tree 就是指的B树。
B树的说明:
-
B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树 的阶是4
-
B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点:重复,直到所对应的儿子指针为空,或已经是叶子结点
-
关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据.
-
搜索有可能在非叶子结点结束
-
其搜索性能等价于在关键字全集内做一次二分查找
B+树:
B+树是B树的变体,也是-种多路搜索树。
B+树的说明:
-
B+树的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
-
所有关键字都出现在叶子结点的链表中( 即数据只能在叶子节点[也叫稠密索引] ),且链表中的关键字(数据)恰好是有序的。
-
不可能在非叶子结点命中
-
非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
-
更适合文件索引系统
-
B树和B+树各有自己的应用场景,不能说B+树完全
比B树好,反之亦然,
B*树:
B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针。
B*树的说明:
-
B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3,而B+树的块的最低使用率为1/2。
-
从第1个特点我们可以看出,B*树分配新结点的概率比B+树要低,空间使用率更高