红黑树原理以及插入、删除算法 附图例说明

一、概念

R-B Tree,全称是Red-Black Tree又称红黑树,它是一种特殊的二叉查找树,红黑树的每个节点上都有存储位表示节点的颜色,可以是红或黑。

二、特性

1、每个节点或者是红色,或者是黑色

2、根节点是黑色的

3、每个叶子节点(NIL)是黑色的。注意:这里的叶子节点,是指为空的叶子节点

4、如果一个节点是红色的,则它的子节点必须是黑色的

5、从任意一个节点到其叶子的所有路径中,所包含的黑节点数量是相同的

特性解析1:根据特性4可知,从每个叶子节点到根节点的所有路径中不能有两个连续的红节点

特性解析2:根据特性5可知,没有一条路径会比其它路径长出两倍,因而红黑树是接近平衡的二叉树

三、应用

红黑树主要用于存储有序的数据,它的时间复杂度是O(logn),非常高效

四、基本操作——插入

1、简介

红黑树的基本操作是添加和删除,在对红黑树进行添加和删除之后,都会用到旋转方法。为什么要用旋转方法呢?因为添加或删除红黑树的节点之后,红黑树就发生了变化,可能就不满足红黑树的5条性质了,也就不是一颗红黑树了。而通过旋转可以使这棵树重新成为红黑树,即旋转的目的就是为了保证红黑树的特性

左旋:对节点x进行左旋,意味着将“x的右孩子变成x的父亲”,而将“x原先的右孩子的左孩子变成x的右孩子”。即左旋中的“左”是指将别旋转的节点变成一个左节点

右旋:对节点x进行右旋,意味着将“x的左孩子变成x的父亲,而将”x原先的左孩子的右孩子变成x的右孩子“。即右旋中的”右“是指将被旋转的节点变成一个右节点

2、插入规则

新插入的节点都为红色

3、红黑树插入的4种情形

(1)新节点位于根节点,其没有父节点时,处理思路:将该节点直接设为黑色即可

(2)新节点的父节点已然是黑色时,处理思路:不用动,这已然是一颗红黑树

(3)父节点和叔节点都是红色时,处理思路:a.将父节点和叔节点设为黑色;b.将祖父节点设为红色;c.将祖父节点设为当前节点,并继续对新当前节点进行操作

(4)父节点是红色,叔节点是黑色时,又分如下四种情况:

  • 当前节点是父亲的左孩子,父亲是祖父的左孩子(Left-Left),处理思路:a.将祖父节点右旋;b.交换父节点和祖父节点的颜色
  • 当前节点是父亲的右孩子,父亲是祖父的左孩子(Right-Left),处理思路:a.将父节点左旋,并将父节点作为当前节点; b.然后再使用Left Left情形
  • 当前节点是父亲的右孩子,父亲是祖父的右孩子(Right-Right),处理思路:a.将祖父节点左旋;b.交换父节点和祖父节点的颜色
  • 当前节点是父亲的左孩子,父亲是祖父的右孩子(Left-Right),处理思路:a.将父节点右旋,并将父节点作为当前节点; b.然后再使用Right Right情形

4、插入图例

通过插入12   1   9   2   0   11   7   19   4   15   18   5   14   13   10   16   6   3   8   17完成上述所有情形的展示。

(1)插入12

edccb34c61f755f4b328ca849a7c14bb74e.jpg

说明:插入的节点若是根节点,则直接将其设置为黑色

(2)插入1

80b0b395340fefd29571ab3dc666cff1c63.jpg

说明:插入的节点若不是根节点,则将其设置为红色

(3)插入9

d2fc0899b2b5619704ef4b5d130534daa9f.jpg

(4)插入2

52b044395da0bb6ccc531d778cc0d9ec29c.jpg

(5)插入0

90a9732b1b80f9485e2ca2744dc4db84319.jpg

(6)插入11

3c0cff9b3352b2638968eb9ec419d0d8ec9.jpg

(7)插入7

df35eb6c4169b2fdc4617f0f0809bb733d1.jpg

(8)插入19

939245d73a6bfe8f5f7f6615ed2c878909e.jpg

(9)插入4

1912dfb2d9030acd4b61a6fbc90a16c04dd.jpg

(10)插入15

22a91e3e89861a92cdca61672c06f65d58c.jpg

(11)插入18

2848c7195c77ee37b194454de911db05892.jpg

(12)插入5

be1369c19ee60a9f1c5ab890d876479da3e.jpg

(13)插入14

3bf6e4442efb2ca594f5b73e1c40792f58c.jpg

(14)插入13

a88879f8165dae1ce7c67b36e67ac1b89ae.jpg

(15)插入10

9ac5df0c9df05a487af21dd22f566099efb.jpg

(16)插入16

6e95a1a0da9fc23df1a1a0eba93a9d2076c.jpg

(17)插入6

e862b6072c263b8e202f0882d317b8dd2b2.jpg

(18)插入3

8ea8afb0d58fdac3988911c216cae2206a7.jpg

(19)插入8

74e84a0faf11ffc6066d4c633540390ff65.jpg

(20)插入17

8a3fbb658eff5e87870076b80eb5754445f.jpg

插入的过程讲解完毕。

五、基本操作——删除

1、红黑树删除的情形

一、从树中删除节点X以寻找后继节点的方式进行删除

情况①:如果X没有孩子,且如果X是红色,直接删除X;如果X是黑色,则X为当前节点进行旋转调色,最后删X

情况②:如果X只有一个孩子C,交换XC的数值,再对新X进行删除。根据红黑树特性,此时X不可能为红色,因为红色节点要么没有孩子,要么有两个黑孩子。此时以新X当前节点进行情况①的判断

情况③:如果X有两个孩子,则从后继中找到最小节点D,交换XD的数值,再对新X进行删除。此时以新X为当前节点进行情况①或②的判断

二、旋转调色N=旋转调色的当前节点[等于情况①中的X]P=N的父亲,W=N的兄弟,Nf=N的远侄子,Nn=N的近侄子

情况1N是根或者N是红色,则:直接将N设为黑色

情况2N不是根且N是黑色,且W为红色,则:W设为黑色,P设为红色,对P进行旋转(NP左子时进行左旋,N为P的右子时进行右旋),将情况转化为情况12345

情况3N不是根且N是黑色,且W为黑色,且W的左右子均为黑色,则:W设为红色,将P设为当前节点进行旋转调色,将情况转化为情况12345

情况4N不是根且N是黑色,且W为黑色,且Nf为黑色,Nn为红色,则:交换WNn的颜色,并对W进行旋转(NP的左子进行右旋,NP的右子进行左旋),旋转后N的新兄弟W有一个红色WR,则转换为情况5

情况5N不是根且N是黑色,且W为黑色,且Nf为红色,Nn为黑色,则:W设为P的颜色,PNf设为黑色,并对P进行旋转(NP的左子进行左旋,NP的右子进行右旋)N设为根

2、插入图例

通过删除12   1   9   2   0   11   7   19   4   15   18   5   14   13   10   16   6   3   8   17完成上述所有情形的展示。

(1)删除12

638db01c50747f74bd59d8474f2ffb05d13.jpg

(2)删除1

f80ac124fb0d521b98b3d7fa16d3e0275ca.jpg

(3)删除9

e9a92cb2031b8b9341de1ed094296c3aba3.jpg

(4)删除2

b8908ecda11fdbc1b300715c3a28ddbdbb5.jpg

(5)删除0

3c2d1cfd4043f408b808d3715a97ef3234e.jpg

(6)删除11

b6b8b1cc654578d643765c9e16f4089b0b6.jpg

(7)删除7

674d63e6d13633f1e8690f3e6b3a18549cc.jpg

(8)删除19

74f4d0440b503ba6fdf9ece565c5cbec7ff.jpg

(9)删除4

0fa2b77a29d81996e050547ccd3dfa9fa2b.jpg

(10)删除15

d23163125654ee7ac0ffe2a93e6c9062dfc.jpg

(11)删除18

6339c5b7d1bc4bdf185c7591fbe1bdbe116.jpg

(12)删除5

6587225caf72bdc232e87896168510a8404.jpg

(13)删除14

50f5fe0622ecddd1ea706a98ef494fb9546.jpg

(14)删除13

ded9e4a6836d0c08cdf57d8e1af02ef746d.jpg

(15)删除10

2005a2cf572d096a8d8fbceb9569d3c1ff4.jpg

(16)删除16

66cf51932e091925ee4a04d5950bdde004b.jpg

(17)删除6

308cf21f25a68d5ccf0fff2dfb8a7154ea4.jpg

(18)删除3

70cb22dce374879a2fd326f37f01927c65a.jpg

(19)删除8

1aa1f39fe7f3964fa7c0aec51133fc8fe0c.jpg

(20)删除20

d0da41cc79be0f94fc035a7711e3c617383.jpg

删除完毕!

转载于:https://my.oschina.net/u/3272058/blog/1914452

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值