码迷,mamicode.com
首页 > 编程语言 > 详细

算法学习笔记:红黑树

时间:2018-01-20 21:26:26      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:ase   inf   算法   bubuko   包含   有一个   基本   ima   算法学习   

一、红黑树特性

1.节点只能为红色或者黑色。

2.根节点为黑色。

3.叶节点(NIL)为黑色。

4.红色节点的子节点必须时黑色节点。

5.任意节点到达该节点的子孙节点的路径包含相同数目的黑色节点。

 

二、红黑树基本操作

技术分享图片

 

三、插入节点

将红黑树作为一棵普通的搜索树进行插入,将插入节点涂为红色。之后有三种情况:

1.若当前节点为根节点,将插入节点涂为黑色。

2.若当前节点的父节点为黑色,不需要调整,仍然是红黑树。

3.若当前节点的父节点为红色,将红色节点移动到根节点后涂黑即可,依然有三种情况:

  Case 1:若当前节点的叔叔节点(父节点的兄弟节点)为红色

    ①将父节点涂为黑色

    ②将叔叔节点涂为黑色

    ③将祖父节点涂为红色

    ④将祖父节点设为当前节点继续进行操作

技术分享图片

 

  Case 2:若当前节点的叔叔节点为黑色,且当前节点为其父节点的右子节点

    ①将父节点设为当前节点

    ②以当前节点为轴进行左旋

技术分享图片

 

  Case 3:若当前节点的叔叔节点为黑色,且当前节点为其父节点的左子节点

    ①将父节点涂为黑色

    ②将祖父节点涂为红色

    ③以祖父节点为轴进行右旋

技术分享图片

 

四、删除操作

将红黑树作为一棵普通的搜索树进行删除。

  1.若删除节点没有子节点,则直接将其删除。

  2.若删除节点只有一个子节点,则删除该节点后其子节点代替其位置。

  3.若删除节点有两个子节点,交换删除节点与其后继节点。重复直到删除节点满足①或②,删除之。

删除结束后对红黑树进行调整

  1.若删除节点为红色,不需要调整,仍然是红黑树。

  2.若删除节点为黑色,那么我们假设代替删除节点初始位置的节点继承了删除节点的黑色,将这个多余的黑色向树根移动即可。存在三种情况:

    (1)若多余的黑色所在的节点为红色,则将该节点涂为黑色即可恢复红黑树性质。

    (2)若多余的黑色所在的节点为黑色,且该节点为根,则不需要调整,仍然是红黑树。

    (3)若多余的黑色所在的节点为黑色,但该节点不为根,则存在四种情况

      Case 1:当前节点的兄弟节点为红色

        ①将当前节点的兄弟节点涂为黑色

        ②将当前节点的父节点涂为红色

        ③以当前节点的父节点为轴进行左旋

      Case 2:当前节点的兄弟节点为黑色,且兄弟节点的子节点均为黑色

        ①将当前节点的兄弟节点设为红色

        ②将当前节点多余的黑色移动到其父节点

      Case 3:当前节点的兄弟节点为黑色,且兄弟节点的左子节点为红色,右子节点为黑色

        ①将当前节点的兄弟节点的左子节点涂为黑色

        ②将当前节点的兄弟节点涂为红色

        ③以当前节点的兄弟节点为轴进行右旋

      Case 4:当前节点的兄弟节点为黑色,且兄弟节点的右子节点为红色,左子节点为红色或黑色

        ①将当前节点的兄弟节点涂为其父节点的颜色

        ②将当前节点的父节点涂为黑色

        ③将当前节点的兄弟节点的右子节点涂为黑色

        ④以当前节点的父节点为轴进行左旋

        ⑤将当前节点设置为根节点

算法学习笔记:红黑树

标签:ase   inf   算法   bubuko   包含   有一个   基本   ima   算法学习   

原文地址:https://www.cnblogs.com/arseneyao/p/8320620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!