平衡二叉树:
二三树
AVL树
B树
红黑树
如何保证一棵树的平衡?
二叉搜索树的查询效率只与高度有关,与结点的个数无关
(1)AVL
- 平衡因子 Balance Factor,绝对值小于1
是它的左子树的高度减去它的右子树的高度(有时相反)
balance factor = {-1,0,1} - 通过选择的操作进行平衡
- 所有叶子结点的平衡因子为 0
旋转操作:
-
左旋
a. 右右子树——》左旋
-
右旋
a. 左左子树——》右旋
-
左右旋
a. 左右子树——》左右旋
- 右左旋
a. 右左子树——》右左旋
为什么要引入AVL?
因为二叉搜索树会出现极端的情况,如果二叉搜索树的结点为1、2、3、4、5,则都为右结点,相当于一个链表了,则优势全无。
平衡因子怎么定的?
查询的时间复杂度等于树的深度
不足:结点需要存储额外信息,且调整次数频繁
(2)近似平衡二叉树——红黑树 Red-black Tree
红黑树是一种近似平衡二叉搜索树,它能够确保任何一个结点的左右子树的高度差小于两倍。具体来说,红黑树是满足如下条件的二叉搜索树:
- 每个结点要么是红色,要么是黑色
- 根节点是黑色
- 每个叶结点(NIL结点,空结点)是黑色的
- 不能有相邻的两个红色结点
- 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长
AVL和红黑树的对比:
AVL查询更好
红黑树提供了更快的插入和删除的操作,AVL旋转更多
AVL存储的额外信息更多,需要更多的内存,红黑树需要存储的节点个数更少
如果读操作多 AVL;插入操作和查询操作比较多 红黑树