平衡二叉树、AVL树和红黑树
平衡二叉树、AVL树和红黑树
平衡二叉树
想要知道AVL树和红黑树,首先我们得了解什么是平衡二叉树,因为从AVL树和红黑树都属于自平衡二叉树。
什么是平衡二叉树:
二叉树得每个节点得左右子树得深度都不能超过1。
平衡得四种类型:
LL型:在左子树的左孩子上插入元素;解决办法:(左旋) 如下图:
RR型:在右子树的右孩子上插入元素;解决办法(右旋)如下图:
RL型:在右子树的左孩子上插入元素;解决办法(先右旋再左旋) 如下图:
LR型:在左子树的右孩子上插入元素;(先左旋再右旋)
AVL树
什么是AVL树:
AVL树是带有平衡条件得二叉查找树,也是最早被发明得自平衡二叉查找树,在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树,所以它必须满足平衡条件。
局限性:
因为AVL树是一个高度平衡树,所以在删除或者插入得时会破坏到AVL树得平衡,只要不满足平衡的条件,就要通过旋转来保持平衡,而旋转的开销是很大的,因此AVL树不适合插入和删除较多的情况。
应用:
Windows NT内核中广泛存在;
红黑树
什么是红黑树:
一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。
性质:
- 每个节点非红即黑
- 根节点是黑的;
- 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
- 如图所示,如果一个节点是红的,那么它的两儿子都是黑的;
- 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点;
- 每条路径都包含相同的黑节点;
黑红树如何保证旋转次数少的:
红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1
,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决。
应用范围:
- 广泛用于C ++的STL中,地图是用红黑树实现的;
- Linux的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
- IO多路复用的epoll采用红黑树组织管理sockfd,以支持快速的增删改查;
- Nginx中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
- Java的TreeMap的实现;
AVL树与红黑树的比较:
- 因为相同节点的情况下AVL树的高度会低于黑红树,因此在做查找时AVL树用的时间相对会少。
- 在删除和插入的时候,AVL树由于具有高度平衡,而红黑树只是弱平衡,因此黑红树旋转次数会远小于AVL树。
- 红黑树在失衡的情况下恢复平衡比AVL树快,因此红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强。
总结:
AVL树:平衡性高,失衡恢复时间长因此稳定性差,易查找不易删除插入。
红黑树:平衡性低,失衡恢复较快因此稳定性高,但树长相对较高,查找,删除,插入都比较方便。
参考:https://blog.****.net/u010899985/article/details/80981053