1.基本概念
二叉树:树状结构,最多只允许两个子节点。
二叉搜索树:二叉树结构,任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。
平衡二叉搜索树:二叉搜索树,“平衡”没有任何一个节点深度过大。
2.AVL-tree
是一个“加上了额外平衡条件”的二叉树。要求任何节点的左右子树高度相差最多为1,保证“对数深度”O(logN)平衡状态。
只要调整“插入点至根节点”路径上,平衡状态被破坏之各节点中最深的那一个,便可使整棵树重新或得平衡。假设该最深节点为X,由于节点最多拥有两个子节点,而所谓“平衡被破坏”意味着X的左右两棵子树的高度相差2,因此我们可以轻易将情况分为四种:
情况1,4彼此对称,称为外侧插入,可以采用单旋转操作调整解决;情况2,3彼此对称,称为内侧插入,可以采用双旋转操作调整解决。
3.单旋转
违反平衡条件的是K2,把K1向上提起,使K2自然下滑,并将B子树挂到K2的左侧。
4.双旋转
违反平衡条件的是K3,以K2为新的根节点,这使得K1必须成为K2的左子节点,K3必须成为K2的右节点。
5.RB-tree(红黑树)
二叉搜索树,而且必须满足以下规则:
1)每个节点不是红色就是黑色。
2)根节点为黑色。
3)如果节点为红,其子节点必须为黑。
4)任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同。
5.1插入节点
新节点必须为红,新节点之父节点必须为黑。假设新节点为X,其父节点为P,祖父节点为G,伯父节点为S,曾祖父节点为GG。
状况1:
S为黑且X为外侧插入,对此情况,我们先对P,G做一次单旋转,再更改P,G颜色,即可重新满足红黑树的规则3。
状况2:
S为黑且X为内侧插入,对此情况,我们必须先对P,X做一次单旋转并且改G,X颜色,再将结果对G做一次单旋转,即可再次满足红黑树规则3。
状况3:
S为红且X为外侧插入,对此情况,我们先对P,G做一次单旋转,并改变X的颜色。如果此时GG为黑,一切搞定。
状况4:
S为红且X为外侧插入,对此情况,我们先对P,G做一次单旋转,并改变X的颜色。此时如果GG为红,还得持续往上做,直到不再有父子连续为红的情况。
5.2一个由上而下的程序
为了避免情况4“父子节点皆为红色”的情况持续向RB-tree的上层结构发展,形成处理时效上的瓶颈,我们可以施行一个由上而下的程序。假设新增节点为A,那么就延着A的路径,只要看到有某节点X的两个子节点皆为红色,就把X改为红色,并把两个子节点改为黑色。
6.参考文献
本文内容摘录于《STL源码剖析》