二叉搜索树、AVL树、RB-tree(红黑树)

参见:《STL源码剖析》

 

(一)二叉搜索树

二叉树:一个二叉树如果不为空,便是由一个根节点和左右二叉子树组成。

二叉搜索树:1)是一颗二叉树;2)任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。

查找:

插入:

删除:

1)若是叶子节点直接删除,修改父节点的指针。

2)若只有一个子节点,直接将其子节点连至其父节点

3)若有两个子节点,以右子树中的最小值取而代之。

 

 

(二)AVL树

AVL树是一个“加上额外平衡条件”的二叉搜索树。其平衡条件的建立是为了确保整棵树的深度为O(logN)。AVL树要求任何节点的左右子树高度相差最多为1。如图,只要调整其中最深的那个节点(18),便可使整棵树重新获得平衡。

“平衡被破坏”意味着X(最深节点)的左右两棵子树的高度相差为2,因此我们可以轻易将情况分为4种。

情况1,4彼此对称,成为外侧插入,可以采用单旋转操作调整解决。情况2,3彼此对称,成为内侧插入,可以采用双旋转操作调整解决。

单旋转:

双旋转:

 

 

(三)RB-tree(红黑树)

红黑树,不仅仅是一个二叉搜索树,而且必须满足以下规则:

1、每个节点不是红色就是黑色(图中深色条纹代表黑色,浅色条纹代表红色)

2、根节点为黑色

3、如果节点为红色,其子节点必须为黑色。

4、任何一个节点至NULL(树尾端)的任何路径,包含之黑色节点树必须相同。

 

为了方便讨论,假设新节点为X,其父节点为P,祖父节点为G,伯父节点为S,曾祖父节点为GG。现在,根据红黑树规则4,X必为红。若P亦为红,则G必为黑。于是,根据X的插入位置及外围节点(S和GG)的颜色,有以下四种考虑。

状况1:S为黑且X为外侧插入------先对P,G做一次单旋转,并更改P,G颜色。

状况2:S为黑且X为内侧插入------先对P,X做一次单旋转并更改X,G颜色,再将结果对G做一次单旋转。

状况3:S为红且X为外侧插入------先对P和G做一次单旋转,并改变X的颜色。若GG为黑,结束;若GG为红,转状况4.

状况4:S为红且外侧插入------先对P和G做一次单旋转,并改变X的颜色。若此时GG为红,还得持续往上做,直到不再有父子连续为红的情况。

一个由上而下的程序:

为了避免出现状况4“父子节点皆为红色"的情况持续向RB-tree的上层结构发展,形成处理时效上的瓶颈,我们施行了一个由上而下的程序:假设新增节点为A,那么就延着A的路径,只要看到有某节点X的两个子节点皆为红色,就把X改为红色,并把两个子节点改为黑色

但是如果X的父节点P亦为红色(注意,此时S必为黑),就像状况1

一样做一次单旋转并改变颜色,或像状况2一样地做一次双旋转并改变颜色。

在此之后,节点35的插入就很单纯了:要么直接插入;要么插入后(若X节点为红)再一次旋转(单双皆可能)即可。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值