码迷,mamicode.com
首页 > 其他好文 > 详细

红黑树

时间:2018-10-17 14:58:59      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:nil   分享   stl   查找   方法   旋转   红黑树   str   比较   

一、R-B Tree简介

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

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意
1、 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
2、特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

技术分享图片


二、红黑树的旋转

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

定理:一棵含有n个节点的红黑树的高度至多为2log(n+1)。

红黑树的时间复杂度为: O(lgn)。

      红黑树的基本操作是添加、删除。在对红黑树进行添加或删除之后,都会用到旋转方法。为什么呢?道理很简单,添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。

旋转包括两种:左旋 和 右旋。下面分别对它们进行介绍。

1、左旋

技术分享图片

对x进行左旋,意味着"将x变成一个左节点"。

例如:

 

技术分享图片

2、右旋

技术分享图片

对x进行右旋,意味着"将x变成一个右节点"。

例如:

技术分享图片


 

三、红黑树的增删查

 1、添加

      将一个节点插入到红黑树中,需要执行哪些步骤呢?

第一步: 将红黑树当作一颗二叉查找树,将节点插入。

第二步:将插入的节点着色为"红色"。

第三步: 通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

 

 

 

红黑树

标签:nil   分享   stl   查找   方法   旋转   红黑树   str   比较   

原文地址:https://www.cnblogs.com/kikis/p/9803336.html

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