算法8--红黑树

合集下载

红黑树详解

红黑树详解

红黑树详解在本文,我将比较透彻地讲解红黑树。

本文适合那些有对二叉树有一定的基础,并且熟悉C语言的读者。

本文最主要的参考资料是《Introduction to Algorithms 3rd Edition》。

1.1 二叉查找树1.1.1 基本概念二叉查找树是在数据结构中比较重要的数据结构之一,从外部看它满足集合性质,具有查找,插入和删除的基本功能,同时还可以求最大值和最小值。

由于二叉查找树独特的性质,它特别适合用来存储动态集合。

定义:对于二叉树上的所有结点x,如果y是x的左子树,那么y.key ≤ x.key。

如果y 是x的右子树,那么y.key ≥ x.key,这样的二叉树就称为二叉查找树(Binary Search Tree)。

我们关心的二叉查找树的逻辑结构,下面的两棵二叉树:图1 二叉查找树。

(a)这一棵高度为3的二叉树,因为10比15小,所以10在15的左子树上;同理在以10为根的左子树里,7比10小所以7在左子树上,12在10为根的子树的右子树上;20在以15为根的右子树上。

(b)这是一棵高度是4的二叉查找树,它的所有key与图(a)是一样的。

在图(a)中,查找最坏的情况是7和12,它们需要经过3次比较才能找到,而图(b)最坏情况是20,需要经过4次比较才能找到。

要想二叉树的查找的花费时间小,我们尽可能让二叉树不出现类以于单链形态的二叉树,让树的高度尽量的低。

对于高度为h的二叉查找树,从树根对叶子最坏的情况是比较h 次。

也就是说,对于高度为h的二叉查找树的最坏查找情况的运行时间是O(h)。

二叉树的查找效率取决于树的高度。

1.1.2 操作二叉树做为动态集,它有查找、插入、删除、最大值、最小值、前驱和后继这些基本操作。

为了后序的方便,我们定义了结点和树,另外我们还用0表示空子树。

查找在二叉查找树中根据给定的key找到该结点。

由于二叉树的性质,我们就知道,如果目标key比当前结点的key要小,那么目标结点必定在当前结点的左子树上。

数据结构与算法(8):红黑树

数据结构与算法(8):红黑树

// 前提:这里里里假设x的右孩子子为y。下面面开始正式操作 // 将 “y的左孩子子” 设为 “x的右孩子子”,即 将β设为x的右孩子子 // 将 “x” 设为 “y的左孩子子的父父亲”,即 将β的父父亲设为x // 将 “x的父父亲” 设为 “y的父父亲”
05 if p[x] = nil[T] 06 then root[T] ← y
的右孩子子”
10 left[y] ← x
// 将 “x” 设为 “y的左孩子子”
11 p[x] ← y
// 将 “x的父父节点” 设为 “y”
理理解左旋之后,看看下面面更更鲜明的例例子子。
2.2 右旋
对Y进行行行右旋,意味着“将Y变成一一个右节点”
右旋的伪代码《算法导论》:参考上面面的示意图和下面面的伪代码,理理解“红黑黑树T的节点y进行行行右 旋”是如何进行行行的。
1.2 红广泛,主要是用用它来存储有序的数据,它的时间复杂度是O(lgn),效率非非常之
高高。
例例如,Java集合中的TreeSet和TreeMap,C++的STL中的Set、Map,以及Linux虚拟内存的管
理理,都是通过红黑黑树去实现的。
二二、红黑黑树的基本操作:左旋和右旋
数据结构与算法(8):红黑黑树
红黑黑树,即R-B Tree,本文文的主要内容包括:红黑黑树的特性、红黑黑树的时间复杂度和它的证明, 红黑黑树的时间复杂度和它的证明,红黑黑树的左旋、右旋、插入入、删除等操作
一一、红黑黑树的定义
1.1 红黑黑树的定义
R-B Tree,全称是Red-black Tree,又又称为“红黑黑树”,它是一一种特殊的二二叉查找树。红黑黑树的每 个节点上都有存储位表示节点的颜色色,可以是红(Red)或黑黑(Black)

c语言红黑树遍历序算法

c语言红黑树遍历序算法

c语言红黑树遍历序算法红黑树是一种自平衡的二叉查找树,它具有良好的平衡性能,能够保持在较低的高度范围内。

在C语言中,我们可以使用递归或者非递归的方式来实现红黑树的遍历。

下面我将分别介绍中序遍历、前序遍历和后序遍历的算法。

1. 中序遍历算法:中序遍历的顺序是先遍历左子树,然后访问根节点,最后遍历右子树。

在C语言中,我们可以使用递归实现中序遍历:c.void inOrderTraversal(struct Node root) {。

if (root != NULL) {。

inOrderTraversal(root->left);printf("%d ", root->data);inOrderTraversal(root->right);}。

}。

2. 前序遍历算法:前序遍历的顺序是先访问根节点,然后遍历左子树,最后遍历右子树。

同样可以使用递归实现前序遍历:c.void preOrderTraversal(struct Node root) {。

if (root != NULL) {。

printf("%d ", root->data);preOrderTraversal(root->left);preOrderTraversal(root->right);}。

}。

3. 后序遍历算法:后序遍历的顺序是先遍历左子树,然后遍历右子树,最后访问根节点。

同样可以使用递归实现后序遍历:c.void postOrderTraversal(struct Node root) {。

if (root != NULL) {。

postOrderTraversal(root->left);postOrderTraversal(root->right);printf("%d ", root->data);}。

}。

另外,以上是使用递归实现的遍历算法,也可以使用非递归的方式来实现,利用栈来辅助实现遍历。

【红黑树】的详细实现(C++)

【红黑树】的详细实现(C++)
>>设新插入的结点为u,它的父结点和祖父结点分别是pu和gu。
>若pu是黑色结点,再插入红色结点,则特性没有破坏,结束重新平衡的过程。
>若pu是红色结点,则出现连续两个红色结点的情形,这时还要考查pu的兄弟结点。
情况1:如果pu的兄弟结点gr是红色结点,此时结点pu的父结点gu是黑色结点,它有两个红色子女结点。交换结点gu和它的子女结点的颜色。
62
{
63
root = s;
64
root->parent = pr;
65
}
66
else //如果父节点不是根节点
67
{
68
if (value < pr->key)
69
{
70
pr->left = s;
71
}
72
else
73
{
74
pr->right = s;
75
}
76
s->parent = pr; //设置新结点s的父节点
136
{
137
y->left->parent = z;
138
}
139
y->parent = z->parent;
140
if (root == z) //z就是根节点
性,结束重新平衡过程。
>当结点u是pu的右子女的情形与u是pu的左子女的情形是镜像的,只要左右指针互换即可。
红黑树的删除
红黑树的删除算法与二又搜索树的删除算法类似,不同之处在于,在红黑树中执行一次二叉搜索树的删除运算,可能会破坏红黑树的特 性,需要重新平衡。 在红黑树中真正删除的结点应是叶结点或只有一个子女的结点。若设被删除为p,其唯一的子女为s。结点p被删除后,结点s取代了它的 位置。 如果被删结点p是红色的,删去它不存在问题。因为树中各结点的黑高度都没有改变,也不会出现连续两个红色结点,红黑树的特性仍然保 持,不需执行重新平衡过程。 如果被删结点p是黑色的,一旦删去它,红黑树将不满足特性的要求,因为在这条路径上黑色结点少了一个,从根到外部结点的黑高度将会 降低。因此必须通过旋转变换和改变结点的颜色,消除双重黑色结点,恢复红黑树的特性。

算法导论-8.红黑树详解

算法导论-8.红黑树详解

算法导论-8.红⿊树详解红⿊树是⼀种相当复杂的数据结构,⼀种能够保持平衡的⼆叉查找树。

如果条件极端,随机⽣成的⼆叉树可能就是⼀个单链表,深度为 $n$,⽽红⿊树的⾼度,即使在最坏情况下也是 $\Theta(n)$ ,红⿊树通过满⾜以下5条性质来保证这⼀点:1. 节点是红⾊或者⿊⾊的。

2. 根节点的⿊⾊的。

3. NIL节点时⿊⾊的。

4. 每个红⾊节点的左⼦节点和右⼦节点必定是⿊⾊的。

5. 任意叶⼦节点的⿊深度相等。

注:这⾥以及下⽂的叶⼦节点是指真正的有意义的“叶⼦节点”⽽不是NIL节点。

如:这是⼀颗红⿊树,注意所有NIL节点其实都是⼀个节点。

我仔细研究了红⿊树,并⾃⼰实现了它,这是⼀个多⽉来看《算法导论》给我带来成就感最⼤的⼀次。

我改进了之前⼆叉查找树的代码,使⽤⼆叉树-⼆叉查找树-红⿊树和⼆叉树节点-红⿊树节点的继承关系链;并且,为了增强算法复杂部分代码的可读性,我对部分功能函数实现了⼀些看上去有点累赘的重载。

这篇博⽂可能不会分析这些⽐较简单的重载,但是完整的代码可以下载(⽅便起见,我将实现和定义全部写在⼀个头⽂件中)。

这篇博⽂参考了《算法导论》第12、13章和维基百科的“红⿊树”词条,所⽤的⽰意图也来⾃于维基百科中,这⾥先作说明。

此外,这⼀篇仅分析红⿊树的实现,不设计章节后⾯的习题。

⼆叉树⼆叉树是最简单的,我提供了⼀些基本的功能。

我尽量使变量名和函数名不⾔⾃明,所以不会作过多解释。

先看⼆叉树节点:template <typename T> class xBinaryTreeNode{public:xBinaryTreeNode();xBinaryTreeNode(T val);T data;xBinaryTreeNode<T>* leftChild;xBinaryTreeNode<T>* rightChild;xBinaryTreeNode<T>* father;};template <typename T> xBinaryTreeNode<T>::xBinaryTreeNode(){leftChild = rightChild = father = NULL;}template <typename T> xBinaryTreeNode<T>::xBinaryTreeNode(T val){data = val;leftChild = rightChild = father = NULL;}然后看⼆叉树的声明:template <typename T> class xBinaryTree{public:xBinaryTree();xBinaryTreeNode<T>* getHead();bool isEmpty();bool doesExit(xBinaryTreeNode<T>* node);bool isRoot(xBinaryTreeNode<T>* node);bool hasLeftChild(xBinaryTreeNode<T>* node);bool hasRightChild(xBinaryTreeNode<T>* node);xBinaryTreeNode<T>** getSelfFromFather(xBinaryTreeNode<T>* node);xBinaryTreeNode<T>** getBrother(xBinaryTreeNode<T>* node);protected:xBinaryTreeNode<T>* nilNode;};有⼏点需要说明:nilNode是⼀个存在的“空节点”,是根节点(或称头结点)的⽗节点,也是所有叶⼦节点实际上的⼦节点。

教你透彻了解红黑树概论

教你透彻了解红黑树概论

红黑树系列,六篇文章于今日已经完成:1、教你透彻了解红黑树2、红黑树算法的实现与剖析3、红黑树的c源码实现与剖析4、一步一图一代码,R-B Tree5、红黑树插入和删除结点的全程演示6、红黑树的c++完整实现源码------------------------------一、红黑树的介绍先来看下算法导论对R-B Tree的介绍:红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red 或Black。

通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

前面说了,红黑树,是一种二叉查找树,既然是二叉查找树,那么它必满足二叉查找树的一般性质。

下面,在具体介绍红黑树之前,咱们先来了解下二叉查找树的一般性质:1.在一棵二叉查找树上,执行查找、插入、删除等操作,的时间复杂度为O(lgn)。

因为,一棵由n个结点,随机构造的二叉查找树的高度为lgn,所以顺理成章,一般操作的执行时间为O(lgn)。

//至于n个结点的二叉树高度为lgn的证明,可参考算法导论第12章二叉查找树第12.4节。

2.但若是一棵具有n个结点的线性链,则此些操作最坏情况运行时间为O(n)。

而红黑树,能保证在最坏情况下,基本的动态几何操作的时间均为O(lgn)。

ok,我们知道,红黑树上每个结点内含五个域,color,key,left,right,p。

如果相应的指针域没有,则设为NIL。

一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:1)每个结点要么是红的,要么是黑的。

2)根结点是黑的。

3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。

4)如果一个结点是红的,那么它的俩个儿子都是黑的。

5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。

(注:上述第3、5点性质中所说的NULL结点,包括wikipedia.算法导论上所认为的叶子结点即为树尾端的NIL指针,或者说NULL结点。

红黑树

红黑树

红黑树的删除
删除节点后对RBT性质的影响讨论:
若删除结点为红色,则对RBT性质没有影响,原因? • 树中各结点的黑高没有变化 • 不存在两个相邻的红色结点 • 因为删除结点为红色,就不可能是根,所以根仍然 为黑
若删除结点为黑色,则对RBT性质会产生影响,因此 需要调整
红黑树的删除
删除的调整算法 讨论
红黑树
目录
§.1 红黑树的定义
§.2 红黑树的性质
§.3 红黑树的旋转
§.4 红黑树的插入
§.5 红黑树的删除
红黑树的插入
step 1:将z节点按二叉查找树规则插入红 黑树中,z是叶子节点; step 2:将z涂红; step 3:调整使其满足红黑树的性质;
红黑树的插入
插入算法示例
• RBInsert(T, z) { y ← nil[T]; x ← root[T]; while x ≠ nil[T] do { y ← x; if key[z] < key[x] then x ← left[x]; else x ← right[x]; } p[z] ← y; if y = nil[T] then
红黑树的删除
Case1:z为叶结点 Case2:z只有一个孩子
处理方法:删除z,连接x。这里x是z的中序后继
注: • case 1是case 2的特例,因为处理模式是一样的 • z是p[z]的左孩子,类似讨论
红黑树的删除
Case3:z两个孩子均非空 实际删除的结点为y!
处理方法: (1)找z的中序后继,即找z的右子树中最左下节点y (2)删除y,将y的内容copy到z,再将y的右子连到 p[y]左下。
root[T] ← z;
//y用于记录当前扫描节点的双亲节点 //从根开始扫描 //查找插入位置 //z插入x的左边

红黑树实现原理及应用技巧介绍

红黑树实现原理及应用技巧介绍

红黑树实现原理及应用技巧介绍红黑树作为一种自平衡的二叉查找树,具有高效的插入、删除和搜索操作。

它的实现原理以及应用技巧在算法和数据结构领域中具有重要的意义。

本文将介绍红黑树的实现原理,同时探讨一些应用中的技巧和注意事项。

一、红黑树的基本概念红黑树是一种二叉查找树,在普通的二叉查找树基础上增加了一组额外的规则,使得树保持平衡。

红黑树具有以下特点:1. 每个节点要么是红色,要么是黑色。

2. 根节点是黑色的。

3. 如果一个节点是红色的,则它的子节点必须是黑色的。

4. 从根节点到叶子节点或者空子节点的每条路径,必须包含相同数目的黑色节点。

5. 空子节点被视为黑色。

二、红黑树的实现原理红黑树的实现原理主要包括节点的插入、删除和搜索操作。

1. 插入操作在红黑树中插入一个节点时,首先按照二叉查找树的规则找到插入位置,将节点插入为叶子节点,并将其颜色设置为红色。

接下来,根据红黑树的规则进行调整,确保树仍然满足平衡性:- 如果插入节点的父节点是黑色,树保持平衡,插入操作完成。

- 如果插入节点的父节点是红色,需要进行颜色和结构的调整。

具体调整方式包括:- 如果插入节点的叔节点(父节点的兄弟节点)是红色,将父节点和叔节点的颜色改为黑色,祖父节点的颜色改为红色,然后将祖父节点设置为当前节点,重新进行调整;如果插入节点没有叔节点,或者叔节点是黑色,进行下一步操作。

- 如果插入节点的父节点是祖父节点的左子节点,插入节点是父节点的左子节点,进行右旋操作;如果插入节点是父节点的右子节点,先进行左旋操作,然后再进行右旋操作。

- 如果插入节点的父节点是祖父节点的右子节点,插入节点是父节点的右子节点,进行左旋操作;如果插入节点是父节点的左子节点,先进行右旋操作,然后再进行左旋操作。

最终,将根节点设为黑色,保证红黑树始终满足规则。

2. 删除操作在红黑树中删除一个节点时,也需要进行相应的调整,以保持树的平衡。

删除操作分为两种情况:被删除节点有零个或一个子节点,以及被删除节点有两个子节点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
14
15
16
• 实验:建立红黑树,完成插入和删除算 法。
17
4
Байду номын сангаас
红黑树表示的有序集的类型: ORDERED_SET=↑rbnodetype;
5
根据红黑树的“红黑性质”,可推出 红黑树具有以下的平衡树性质:任意一棵 有n个结点(不包括前端结点)的红黑树的高 度至多为2log(n+1)。 讨论:首先证明在以红黑树中任一结点x为 根的子树中,至少包含2bh(x) -1个结点,其 中bh(x)为结点x的黑高度。对结点J的高度 用数学归纳法:
9
旋转变换分为左旋转和右旋转两种类型,如图 5—12所示。
变换是通过修改结点x和y的有关指针来实现的。
10
11
3、插入运算
往红黑树表示的有序集插入一个元素的运 算,在最坏情况下用O(logn)时间就可完成。首 先将元素x插入红黑树,并将存储元素x的树结 点着成红色。为了使插入一个元素后的红黑树 仍满足红黑性质,必须对一些结点进行旋转变 换或重新着色。在红黑树中进行元素插入的运 算可实现如下:
6
证明:
(1)对于前端结点x,其高度为-1,其黑高度 bh(x)=0,此时子树中结点个数为20-1=0。当结 点x的高度为0时,其两个儿子结点均为前端结 点,故其黑高度为bh(x)=1。此时,以x为根的子 树中恰好含有21-1=1个结点; (2)当结点x的高度大于0时,它有两个儿子结点。 当其儿子结点y为红结点时:bh(y)=bh(x)当其儿 子结点y为黑结点时:bh(y)=bh(x)-1由于结点y的 高度小于结点x。
2
黑高度:从红黑树中任一结点x出
发,到达一个前端结点的任意一条
路径上(不包括结点x)的黑结点个数
称为结点x的黑高度,记作 bh(x)。 红黑树的黑高度:为其根结点的黑 高度。
3
用红黑树来存储有序集中的元素时, 其结点类型可说明为:
type rbnodetype=record element:elementtype; leftchild,rightchild,parent:↑rbnodetype; color:(red,black) end;
红黑树
1、红黑树的定义和性质
红黑树是一类特殊的二叉搜索树,其中 每个结点被“染成”红色或黑色。若将 二叉搜索树结点中的nil指看作是指向一 个空结点,则称这类空结点为二叉搜索 树的前端结点,并规定所有前端结点的 高度为-1。
1
红黑树是一棵满足下面“红黑性质” 的染色二叉搜索树。
性质1:每个结点被染成红色或黑色; 性质2:每个前端结点为黑色结点; 性质3:红结点的儿子结点均为黑结点; 性质4:在从任一结点到其子孙前端结点 的所有路径上应该有相同个数 的黑结点。
7
由归纳假设知,以y为根的子树中至少包含:
2bh ( x ) 1 2bh ( x )1
以x根的子树中至少包含:
个结点。
(2bh ( x )1 1) (2bh ( x )1 1) 1 2bh ( x ) 1
个结点。由数学归纳法即知上述结论成立。
(3)红黑树的高度为h,由红黑树的性质(3)和
性质(4)可知,从根结点到任何一个前端结点的 路径上至少有一半的结点(不包含根结点)是黑 结点。因此,红黑树的黑高度至少为h/2.可知
n 2h / 2 1即h 2 log( n 1)
8
2、旋转变换
在红黑树中用二叉搜索树的插入或删 除运算插入或删除一个元素后,我们可以 通过改变某些结点的颜色,或改变某些结 点的指针来维持红黑性质。改变结点指针 时要用到结点的旋转变换,其目的是调整 结点的子树高度,并维持二叉搜索树性质, 即结点中元素的中序性质。
相关文档
最新文档