平衡二叉树、AVL树和红黑树

平衡二叉树、AVL树和红黑树

平衡二叉树

       想要知道AVL树和红黑树,首先我们得了解什么是平衡二叉树,因为从AVL树和红黑树都属于自平衡二叉树。

什么是平衡二叉树:

        二叉树得每个节点得左右子树得深度都不能超过1。

平衡得四种类型:

       LL型:在左子树的左孩子上插入元素;解决办法:(左旋) 如下图:

RR型:在右子树的右孩子上插入元素;解决办法(右旋)如下图:

   RL型:在右子树的左孩子上插入元素;解决办法(先右旋再左旋) 如下图:

    LR型:在左子树的右孩子上插入元素;(先左旋再右旋)

AVL树

什么是AVL树:

       AVL树是带有平衡条件得二叉查找树,也是最早被发明得自平衡二叉查找树,在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树,所以它必须满足平衡条件。

局限性:

     因为AVL树是一个高度平衡树,所以在删除或者插入得时会破坏到AVL树得平衡,只要不满足平衡的条件,就要通过旋转来保持平衡,而旋转的开销是很大的,因此AVL树不适合插入和删除较多的情况。

应用:

     Windows NT内核中广泛存在;

红黑树

什么是红黑树:

  一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树

性质:

  1.  每个节点非红即黑
  2.  根节点是黑的;
  3.  每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
  4.  如图所示,如果一个节点是红的,那么它的两儿子都是黑的;
  5. 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点;
  6. 每条路径都包含相同的黑节点;

黑红树如何保证旋转次数少的:

红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决。

应用范围:

  1. 广泛用于C ++的STL中,地图是用红黑树实现的;
  2. Linux的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
  3.  IO多路复用的epoll采用红黑树组织管理sockfd,以支持快速的增删改查;
  4.  Nginx中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
  5.  Java的TreeMap的实现;

AVL树与红黑树的比较:

  1.  因为相同节点的情况下AVL树的高度会低于黑红树,因此在做查找时AVL树用的时间相对会少。
  2.  在删除和插入的时候,AVL树由于具有高度平衡,而红黑树只是弱平衡,因此黑红树旋转次数会远小于AVL树。
  3. 红黑树在失衡的情况下恢复平衡比AVL树快,因此红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强。

总结:

    AVL树:平衡性高,失衡恢复时间长因此稳定性差,易查找不易删除插入。

   红黑树:平衡性低,失衡恢复较快因此稳定性高,但树长相对较高,查找,删除,插入都比较方便。

参考:https://blog.csdn.net/u010899985/article/details/80981053

平衡二叉树、AVL树和红黑树

猜你喜欢

转载自blog.csdn.net/Wu_0526/article/details/107973520