数据结构算法-1.1.1 红黑树与二叉树
Posted Soaring2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构算法-1.1.1 红黑树与二叉树相关的知识,希望对你有一定的参考价值。
1.红黑树应用的场景
1.1map-红黑树的封装
1.2nginx-》中的一点
1.3定时器-
1.4进程调度cfs 进程调度期间 进程集合存储 期间用红黑树进行查找 快且顺序
1.5 内存管理-内存分配时使用红黑树存储
2红黑树使用的两种情况
2.1做key,value 通过key 做value的查找
2.2利用红黑树的的中序遍历查找 中序遍历是顺序的
3红黑树实现
3.1 红黑树性质
(1)每个节点是红或是黑的(两类是非)
(2)根节点是黑的
(3)每个叶子节点是黑的
(4)如果一个节点是红色的,则他的两个儿子是黑色的,红黑树中不能有相邻的两个红色节点
(5)对每个结点,从该节点到其子孙结点的所有路径上的包含相同数目的黑节点。
3.2红黑树C实现
typedef int KEY_TYPE;
tyoedef struct _rbtree_node{
unsigned char color;
struct _retree_node *left;
struct _retree_node *right;
struct _rbtree_node *parent
KEY_TYPE key;
void *value;
}rbtree_node;
typedef struct rbtree{
rbtree_node *root;
rbtree_mode *nil;
};
红黑树旋转
void _left_rotate(rbtree *T,rbtree_node *x){
rbtree_node *y = x->right;//
x->right = y->left;
if(y->lift != t->nil)
{
y->left->parent=x;
}
y->parent = x->parent;
if(x->parent== t->nil){
t->root=y;
}
else if(x == x-> parent->left)
{
x->parent->left=y;
}
else
{
x->parent->right=y;
}
y->left=x;
x->parent=y;
}//endleft_rotate?
void _right_rotate(rbtree *x,rbtree_node *y)
{
}
插入 没有相同的插到叶子节点
insert
typedef int KEY_TYPE;
typedef struct _rbtree_node{
unsigned char color;
struct _rbtree_node *left;
struct _rbtree_node *right;
struct _rbtree_node *parent;
KEY_TYPE key;
void *value;
}rbtree_node;
typedef struct rbtree{
rbtree_node *root;
rbtree_node *nil;
};
#define RED 0
#define BLACK 1
void rbtree_fix_up(rbtree *T,rbtree_node *z)
{
while (z->parent->color == RED)
{
if (z->parent == z->parent->parent->left)
{
rbtree_node *y = z->parent->parent->right;
if (y->color ==RED)
{
z->parent->color = BLACK;
y->color = BLACK;
z->parent->parent->color= RED;
z= z->parent->parent;
}
else
{
if (z == z->parent->right)
{
z = z->parent;
rb_left(T,z);
}
z->parent ->color =BLACK;
z->parent->parent ->color = RED;
_rb_right(T,z->parent->parent);
}
}
}
T->root->color=BLACK;
}
void rbtree_insert(rbtree *T, rbtree_node *z)
{
rbtree_node *x = T->root;
rbtree_node *y = T->nil;
while (x != T->nil)
{
y = x;
if (z-> key < x-> key)
{
x=x->left;
}
else if (z-> key>x-> key)
{
x=x->right;
}
else
{
return;
}
}
z->parent=y;
if (y== T->nil)
{
T->root=z;
}
else if(z-> key< y-> key)
(
y->left = z;
)
else
{
y->right = z;
}
z->left =T-> nil;
z->right = T->nil;
z->color = RED;
rbtree_fix_up(T,z);
}
以上是关于数据结构算法-1.1.1 红黑树与二叉树的主要内容,如果未能解决你的问题,请参考以下文章