`
pleasetojava
  • 浏览: 730431 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

红黑树的各种操作

 
阅读更多

红黑树各种操作

// 红黑树各种操作.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;
enum MyColor{red,black};
typedef int DType;

struct RBTree
{
DType data;
MyColor col;
RBTree *parent;
RBTree *left;
RBTree *right;
};
//查询节点信息
RBTree * search(RBTree * r,DType val)
{
RBTree *x = r;
while(x!=NULL&&x->data!=val)
{
if(x->data>val)
x = x->left;
else
x = x->right;
}
return x;
}
//左旋转
RBTree * left_rotate(RBTree * r,RBTree *x)
{
RBTree *y = x->right;
x->right = y->left;
if(y->left!=NULL)
y->left->parent = x;
y->parent = x->parent;
if(x->parent==NULL)
r=y;
else if(x==x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->left=x;
x->parent = y;
return r;
}
//右旋转
RBTree * right_rotate(RBTree* r,RBTree *x)
{
RBTree *y = x->left;
x->left = y->right;
if(y->right!=NULL)
y->right->parent = x;
y->parent = x->parent;
if(x->parent==NULL)
r=y;
else if(x==x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->right = x;
x->parent = y;
return r;
}
//插入元素后,保持红黑性
RBTree* keep_insert_RBTree(RBTree *r,RBTree *s)
{
while(s->parent->col==red)
{
if(s->parent==s->parent->parent->left)
{
RBTree *y = s->parent->parent->right;
if(y->col==red)
{
y->col = black;
s->parent->col = black;
s->parent->parent->col=red;
s = s->parent->parent;
}
else
{
if(s==s->parent->right)
{
s = s->parent;
r = left_rotate(r,s);
}
s->parent->col = black;
s->parent->parent = red;
r = right_rotate(r,s->parent->parent);
}
}
else
{
RBTree *y = s->parent->parent->left;
if(y->col==red)
{
y->col = black;
s->parent->col = black;
s->parent->parent->col = red;
s = s->parent->parent;
}
else
{
if(s==s->parent->left)
{
s = s->parent;
r = right_rotate(r,s);
}
s->parent->col = black;
s->parent->parent = red;
r = left_rotate(r,s->parent->parent);
}
}
}
r->col = black;
return r;
}
//插入元素
RBTree *insert(RBTree *r,RBTree *s)
{
RBTree *p = search(r,s->data);
if(P==NULL)
{
RBTree *y=NULL;
RBTree *x=r;
while(x!=NULL)
{
y = x;
if(s->data<x->data)
x = x->left;
else
x = x->right;
}
s->parent = y;
if(y==NULL)
r = s;
else if(s->data<y->data)
y-left = s;
else
y->right = s;
s->left = NULL;
s->right = NULL;
s->col = red;
r = keep_insert_RBTree();
}
return r;
}
//取得最小值节点
RBTree * get_min(RBTree *r)
{
RBTree * s = r;
while(s->left!=NULL)
s = s->left;
return s;
}
//取得最大值节点
RBTree * get_max(RBTree *r)
{
RBTree *s = r;
while(s->right!=NULL)
s = s->right;
return s;
}
//取得中序前驱节点
RBTree * get_processor(RBTree *r,DType val)
{
RBTree *p = search(r,val);
if(p==NULL)
return NULL;
else
{
if(p->left != NULL)
return get_max(r);
else
{
RBTree *q = p->parent;
while(q!=NULL&&p==q->parent->left)
{
p = q;
q = p->parent;
}
return q;
}
}
}
//取得中序后继节点
RBTree * get_successor(RBTree *r,DType val)
{
RBTree *p = search(r,val);
if(p==NULL)
return NULL;
else
{
if(p->right != NULL)
return get_min(r);
else
{
RBTree *q = p->parent;
while(q != NULL&&p==q->right)
{
p = q;
q = p->parent;
}
return q;
}
}
}
//删除节点操作
RBTree *delete_node(RBTree *r,int val)
{
RBTree *p = search(r,val);
RBTree *y,*x;
if(p != NULL)
{
if(p->left==NULL||p->right==NULL)
y = p;
else
y = get_successor(r,val);
if(y->left != NULL)
x = y->left;
else
x = y->right;
if(x != NULL)
x->parent = y->parent;
if(y->parent == NULL)
r = x;
else if(y == x->parent->left)
x->parent->left = x;
else
x->parent->right = x;
if(y != p)
{
p->data = y->data;
}
if(y->col==black)
r = keep_delete_RBTree(r,x);
}
return r;
}
//保持删除节点后,树的红黑性
RBTree *keep_delete_RBTree(RBTree *r,RBTree *s)
{
while(s != r&&s->col==black)
{
if(s==s->parent->left)
{
RBTree *w = s->parent->right;
if(w->col==red)
{
w->col = black;
s->parent->col = red;
lr = eft_rotate(r,s->parent);
w = s->parent->right;
}
if(w->left->col==black&&w->right->col==black)
{
w->col=red;
s = s->parent;
}
else if(w->right->col==black)
{
w->left->col = black;
w->col = red;
r = right_rotate(r,w);
w = s->parent->right;
}
else
{
w->col = s->parent->col;
s->parent->col = black;
w->right->col = black;
r = left_rotate(r,s->parent);
s = r;
}
}
else
{
same as the case of "left";
}
}

s->col = black;

return r;
}
int _tmain(int argc, _TCHAR* argv[])
{

......code.......
return 0;
}

分享到:
评论

相关推荐

    红黑树-动态演示生成红黑树

    红黑树的主要目标是保证在最坏情况下的操作复杂度为O(log n)。 红黑树的每个节点都有两种颜色:红色或黑色。树的根节点默认为黑色,叶子节点(NIL或空节点)也默认为黑色。以下是红黑树的五个性质: 1. 每个节点...

    红黑树java操作代码 红黑树是java里面遍历性能最好数据结构

    在Java中实现红黑树,需要对数据结构有深入理解,并能够熟练运用递归和迭代策略来处理各种情况。通过这两个文件,我们可以学习如何在实际编程环境中应用红黑树。 总之,红黑树因其良好的平衡性和高效的查询性能,在...

    红黑树的插入与删除_详细整理资料

    ### 红黑树的插入与删除:详细解析 红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年发明,最初被称为“对称二叉B树...这使得红黑树成为高效数据结构的一个典范,广泛应用于各种需要动态维护排序数据的场景中。

    红黑树原理详解

    红黑树的主要特性保证了其在插入、删除和查找操作中的高效性能,通常时间复杂度为O(log n),其中n是树中元素的数量。 红黑树的性质如下: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶节点...

    红黑树的源码与测试函数

    测试用例通常包括插入不同顺序的元素、删除元素、查找元素等,确保各种操作在红黑树上的行为符合预期,并且保持了红黑树的平衡。 3. **mymempool.c 和 mymempool.h**:这些文件可能包含了内存池的实现,内存池是一...

    红黑树-使用C++实现-简单练习

    这些测试用例应覆盖各种边界条件和异常情况,以确保红黑树的实现是健壮的。 总之,红黑树是一种重要的数据结构,广泛应用于许多系统和库中,如Linux内核中的内存分配器。C++实现红黑树不仅需要对二叉树有深入理解,...

    红黑树基本操作算法

    红黑树插入删除算法,检查了几次都没有错误,算法导论

    红黑树基本操作的C++实现

    插入操作需要考虑红黑树的五个性质:每个节点非红即黑;根节点是黑色;叶节点(NIL/NULL节点)是黑色;如果一个节点是红色,则其子节点必须是黑色;对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同...

    红黑树完整实现文件

    红黑树的平衡策略主要依赖于旋转操作:左旋、右旋、颜色翻转等,这些操作用于在插入和删除节点后调整树的结构,以确保红黑树的性质得以保持。 在"红黑树完整实现文件"中,可能包含了以下内容: 1. **节点结构**:...

    红黑树、区间树

    红黑树的主要操作包括插入、删除和旋转,其中旋转是维护红黑树性质的关键。 接下来,我们讨论区间树。区间树是一种基于红黑树的高级数据结构,主要用于高效地处理区间查询和更新问题。它继承了红黑树的特性,并在此...

    红黑树-数据结构

    红黑树广泛应用于各种数据结构和算法中,例如标准模板库(STL)中的`std::map`和`std::set`就是基于红黑树实现的,它们提供了一种高效、有序的键值对存储方式。此外,数据库索引、虚拟内存管理、编译器符号表等也都...

    红黑树和AVL树的实现

    红黑树的插入和删除操作比AVL树更复杂,因为它们涉及颜色翻转和旋转来维护红黑树的性质。例如,插入新节点可能导致不平衡,这时可能需要进行单旋、双旋以及颜色调整。删除节点可能需要更复杂的操作,包括重新染色、...

    红黑树的例子

    #### 三、红黑树操作 红黑树的关键操作包括插入、删除和查找。这些操作在维持树的红黑性质的同时,确保了树的高度始终保持在对数级别,从而保证了操作的时间复杂度为O(log n)。 - **插入操作:** 当插入新节点时,...

    红黑树算法及其应用_高庆.pdf

    红黑树是一种高效的查找树数据结构,广泛应用于信息管理系统中的插入、删除、查找操作。红黑树的定义、优点、基本操作及算法将在下面详细介绍。 红黑树的定义 红黑树是一棵二叉查找树,如果满足以下性质,则称为...

    delphi红黑树源码

    2. **旋转操作**:为了保持红黑树的性质,插入和删除操作可能会导致旋转,包括左旋(left-rotate)和右旋(right-rotate)。这些操作用于重新平衡树。 3. **插入操作**:当新节点插入时,会根据红黑树的规则进行...

    红黑树实现源码

    插入操作通常会导致违反红黑树的性质,因此插入后需要进行一系列的调整,如颜色翻转和旋转,以恢复红黑树的平衡。插入新节点时,初始颜色设置为红色,然后通过以下步骤进行调整: - 左旋:用于解决右倾红节点的...

    红黑树的实现

    2. **颜色调整**:插入可能导致树违反红黑树的性质,因此需要进行一系列的颜色翻转和旋转操作(左旋、右旋)来恢复性质。主要的调整策略有颜色翻转(颜色修复)和旋转操作(LL旋转、LR旋转、RL旋转、RR旋转)。 3. *...

    gcc 红黑树(二叉搜索树 红黑树 动态排序树 精确计时)

    红黑树是一种自平衡二叉查找树,它的设计目的是为了在保持查找效率的同时,尽可能地减少插入和删除操作带来的性能损失。在计算机科学中,它是一种广泛应用的数据结构,特别是在动态排序和高效查找方面。 二叉搜索树...

    红黑树的C实现,算法导论的红黑树C实现

    5. 转换和旋转:红黑树的平衡主要依赖于两种旋转操作:左旋和右旋。这些操作用于在插入和删除后调整树的结构,以保持红黑树的性质。 6. 翻转颜色:有时,为了保持红黑树的性质,我们需要翻转特定路径上的节点颜色。...

    红黑树学习文档

    红黑树的设计目的是为了在保持二叉查找树基本操作高效的同时,通过自平衡机制来减少最坏情况下的性能下降。这些操作包括插入、删除和搜索等。平衡的策略使得在插入和删除后,树的高度可以保持在O(log n)级别,从而...

Global site tag (gtag.js) - Google Analytics