为什么Nginx使用红黑树平衡二叉树

文章内容从网络中收集,如原作者不同意转载,请通知我,我将删除。先谢谢大神。

二叉树

在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(rightsubtree)。

 

 

二叉排序树

二叉排序树(BinarySortTree),又称二叉查找树、二叉搜索树。它或者是一棵空树;或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。若子树为空,查找不成功。

 

 

平衡二叉搜索树

平衡二叉搜索树(Self-balancingbinary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定。

 

 

高度平衡二叉树

AVL树又称高度平衡的二叉搜索树,是1962年由两位俄罗斯的数学家G.M.Adel’son-Vel,sky和E.M.Landis提出 的。引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度。为此,就必须每向二叉树插入 一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度。

 

红黑树

红黑树也是平衡二叉树的一种。

最初的疑问

 

今天查看红黑树,就是很好奇为什么使用红黑树、又是为什么使用平衡二叉树?关于这个答案,我先百度了下,看下为什么平衡二叉树会更好?如下:

 

“首先平衡二叉搜索树是特殊的二叉排序树,他的结点元素间存在着偏序关系。其次相对于一般的二叉排序树,平衡二叉搜索树的左右子树的深度差也有不超过1层的约束。这样使得平衡二叉搜索树是同种元素序列情况下的深度最小的二叉排序树。这可以减少二叉树元素查找的深度,从而提升平均查找效率。”

 

 

既然知道平衡二叉树的查找效率更高,那么为什么使用红黑树这种平衡二叉树?是不是还有别的平衡二叉树?

 

AVL树,对AVL插入一个node或者删除一个node,显然不需要每次都做rotation来维持balance。且AVL插入最多也只需要2次旋转。

 

下面是我的回答:

 

1. 如果插入一个node引起了树的不平衡,AVLRB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删noderoot这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。

 

2. 其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Treeunbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVLsearch效率更高。

 

3. map的实现只是折衷了两者在searchinsert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。”

 

 

 

 

 

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/lhjsx0518/article/details/79565909
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞