STL-RB Tree

规则

STL-RB Tree_第1张图片
Note:
根据规则4,新增节点必须为红
根据规则3,新增节点之父节点必须为黑色
当新节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件时,就必须调整颜色并旋转树形

插入节点

EX:分别插入3,8,35,75 根据二叉搜索树的规则插入
STL-RB Tree_第2张图片
不管插入哪一个节点都破坏了RB-Tree的规则,必须调整树形
(旋转树形,并改变颜色)

节点定义

新节点: X
父节点: P
祖父节点: G
伯父节点(父节点之兄弟): S
曾祖父节点:GG

S为黑(NULL视为黑)且X外侧插入

对P、G做一次单旋转,并改变颜色
STL-RB Tree_第3张图片

S为黑且X为内侧插入

先对P、X做一次单旋转,并更改G、X颜色
再将结果对G做一次单旋转
STL-RB Tree_第4张图片

S为红且X为外侧插入

先对P、G做一次单旋转,并改变X的颜色
如果GG是黑色
STL-RB Tree_第5张图片
如果GG是红色(见下一种情况)

S为红色且X为外侧插入

先对P、G做一次单旋转,并改变X的颜色
如果GG亦为红,还得持续往上做,直到不再有父子持续为红的情况

一个由上而下的程序

为了避免情况4,即父子节点皆为红色的情况持续向RB-Tree的上层结构发展,形成处理时效的瓶颈,我们可以施行一个由上而下的程序(top-down procedure):
假设新增节点A,那么就沿着A的路径,只要看到有某节点X的两个子节点皆为红色,就把X改为红色,并把两个子节点改为黑色
Ex:
STL-RB Tree_第6张图片
STL-RB Tree_第7张图片

与AVL的区别

  • 因为AVL是高度平衡的(不过最多也就比RB-Tree高一层)所以AVL的查询性能是高于RB-Tree(但仅仅多一次比较)
  • 插入一个节点引起的不平衡,AVL和RB-Tree都最多只需要2次旋转操作。但是在大量数据需要插入时,由于AVL的高度平衡性,更容易引起树的不平衡,因此会有更多的旋转操作
  • 删除节点来看,最坏情况下,AVL需要维护从被删节点到root这条路径,所有节点的不平衡性,因此需要旋转量级O(logN)。而RB-Tree最多只需要3次旋转,O(1)的复杂度
  • 在STL中,map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL
    总结:
    红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完爆avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多

你可能感兴趣的:(RB-Tree)