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

【Java深入研究】10、红黑树

时间:2018-05-03 00:54:13      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:str   bsp   inux   步骤   eem   set   后继节点   treemap   nginx   

一、红黑树介绍

红黑树是二叉查找树,红黑树的时间复杂度为: O(lgn)

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)每个红色结点必须有两个黑色的子结点

(5)从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSetTreeMap,C++ STL中的set、map,以及nginx、Linux虚拟内存的管理,都是通过红黑树去实现的。

二、红黑树操作

1、左旋 和 右旋

在对红黑树进行添加或删除之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。旋转包括两种:左旋 和 右旋

旋转之后,仍然是二叉排序树

2、添加

首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。

详细步骤

  • 第一步: 将红黑树当作一颗二叉查找树,将节点插入。
  • 将插入的节点着色为"红色"(为了不违背第五条特性)
  • 当被插入的节点的父节点是红色,通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

3、删除

将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:

  • 如果删除的是叶节点,可以直接删除
  • 如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置
  • 如果有两个子节点,这时候就可以把被删除元素的右支的最小节点(被删除元素右支的最左边的节点)和被删除元素互换,我们把被删除元素右支的最左边的节点称之为后继节点(后继元素)
  • 当被删除元素(交换之后的元素)为黑,且有一个右子节点为红时,将右子节点涂黑放到被删除元素的位置

三、和AVL树比较

1、AVL树是最先发明的自平衡二叉查找树。一棵AVL树满足以下的条件

  • 它的左子树和右子树都是AVL树 
  • 左子树和右子树的高度差不能超过1 
AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。综合来说,RB-tree的统计性能是高于AVL的。

 

参考文章:

https://www.cnblogs.com/George1994/p/6903437.html

https://blog.csdn.net/sun_tttt/article/details/65445754

https://www.zhihu.com/question/20545708

【Java深入研究】10、红黑树

标签:str   bsp   inux   步骤   eem   set   后继节点   treemap   nginx   

原文地址:https://www.cnblogs.com/wangzhongqiu/p/8982790.html

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