#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <assert.h>
enum RB_COLOR {BLACK = 0, RED = 1};
//------------------------------------------------------------------
int nodecount=0, nodecount2=0;
//------------------------------------------------------------------
//rbtreenode struct
struct rbtreenode_item {
enum RB_COLOR color;
int value;
void *data;
struct rbtreenode_item *left;
struct rbtreenode_item *right;
struct rbtreenode_item *parent;
};
typedef struct rbtreenode_item rbtreenode_t;
//rbtree
struct rbtree_item {
rbtreenode_t *root;
rbtreenode_t *nil;
};
typedef struct rbtree_item rbtree_t;
//-------------------------------------------------------------------
// rbtree functions
void rbtree_init(rbtree_t *rbtree);
void left_rotate(rbtree_t *rbtree, rbtreenode_t *xnode);
void right_rotate(rbtree_t *rbtree, rbtreenode_t *xnode);
void rbtree_insert(rbtree_t *rbtree, int value);
void rb_insert_fixup(rbtree_t *rbtree, rbtreenode_t *znode);
void rb_delete(rbtree_t *rbtree, rbtreenode_t *znode);
void rb_delete_fixup(rbtree_t *rbtree, rbtreenode_t *znode);
void rb_inorder(rbtreenode_t *rbtnode, rbtreenode_t *nil);
rbtreenode_t *rb_search_node(rbtree_t *rbtree, int value);
//===========================================================
// rb_search_node
// return a rbtreenode_t pointer base on the value
//===========================================================
rbtreenode_t *rb_search_node(rbtree_t *rbtree, int value) {
rbtreenode_t *xnode=NULL;
xnode = rbtree->root;
while(xnode != rbtree->nil) {
if(value > xnode->value)
xnode = xnode->right;
else if(value < xnode->value)
xnode = xnode->left;
else if(value == xnode->value)
return xnode;
}
xnode = NULL;
return xnode;
}
//===========================================================
// init a rbtree
//===========================================================
void rbtree_init(rbtree_t *rbtree) {
//make a nil node
rbtree->nil = (rbtreenode_t *)malloc(sizeof(rbtreenode_t));
rbtree->nil->value = 0;
rbtree->nil->color = BLACK;
rbtree->nil->data = NULL;
rbtree->nil->left = NULL;
rbtree->nil->right = NULL;
rbtree->nil->parent = NULL;
rbtree->root = rbtree->nil;
}
//=============================================================
// left_rotate
// make sure xnode->right != NULL
//=============================================================
void left_rotate(rbtree_t *rbtree, rbtreenode_t *xnode) {
rbtreenode_t *ynode;
//ynode is xnode's right child
ynode = xnode->right;
xnode->right = ynode->left;
if(ynode->left != rbtree->nil)
ynode->left->parent = xnode;
if(xnode != rbtree->nil)
ynode->parent = xnode->parent; //need fixup , xnode->parent may == NULL
if(xnode->parent == rbtree->nil) // root's parent is nil
rbtree->root = ynode; // so make ynode is root
else {
if(xnode->parent->left == xnode)
xnode->parent->left = ynode;
else
xnode->parent->right = ynode;
}
ynode->left = xnode;
if(xnode != rbtree->nil)
xnode->parent = ynode;
}
//==========================================================
// right_rotate
// make sure xnode->left != NULL
//==========================================================
void right_rotate(rbtree_t *rbtree, rbtreenode_t *xnode) {
rbtreenode_t *ynode;
//ynode is xnode's left child
ynode = xnode->left;
xnode->left = ynode->right;
if(ynode->right != rbtree->nil)
ynode->right->parent = xnode;
if(xnode != rbtree->nil)
ynode->parent = xnode->parent;
if(xnode->parent == rbtree->nil)
rbtree->root = ynode;
else {
if(xnode->parent->left == xnode)
xnode->parent->left = ynode;
else
xnode->parent->right = ynode;
}
ynode->right = xnode;
if(xnode != rbtree->nil)
xnode->parent = ynode;
}
//============================================================
// rbtree_insert
//============================================================
void rbtree_insert(rbtree_t *rbtree, int value) {
rbtreenode_t *xnode, *ynode, *znode;
xnode = rbtree->root;
ynode = rbtree->nil;
// znode is the new node to be inserted
znode = (rbtreenode_t *)malloc(sizeof(rbtreenode_t));
assert(znode);
znode->color = RED;
znode->data = NULL;
znode->value = value;
znode->parent = NULL;
znode->left = NULL;
znode->right = NULL;
while(xnode != rbtree->nil) {
ynode = xnode;
if(znode->value < xnode->value)
xnode = xnode->left;
else if(znode->value > xnode->value)
xnode = xnode->right;
else if(znode->value == xnode->value) { //value dup
free(znode);
return;
}
}
znode->parent = ynode;
if(ynode != rbtree->nil) {
if(znode->value > ynode->value)
ynode->right = znode;
else if(znode->value < ynode->value)
ynode->left = znode;
} else {
rbtree->root = znode; //znode is root
}
znode->left = rbtree->nil;
znode->right = rbtree->nil;
nodecount2++;
printf("<value: %d inserted>/n", znode->value);
rb_insert_fixup(rbtree, znode);
}
//================================================================
// rb_insert_fixup
// znode is the new child
//================================================================
void rb_insert_fixup(rbtree_t *rbtree, rbtreenode_t *znode) {
rbtreenode_t *ynode;
while((znode->parent != NULL) && (znode->parent->color == RED)) { //terminate when znode's parent is BLACK
// if znode->parent->color == RED, znode->parent->parent != NULL
if(znode->parent == znode->parent->parent->left) { //znode's parent is at left
ynode = znode->parent->parent->right; //ynode is znode's uncle
if((ynode != NULL) && (ynode->color == RED)) { //znode's parent and ynode is RED
znode->parent->color = BLACK; //change znode's parent to BLACK
ynode->color = BLACK; //change znode's uncle to BLACK
znode->parent->parent->color = RED; //change znode's grand father to RED
znode = znode->parent->parent; //znode is changed to its grand father
} else {
if(znode == znode->parent->right){ //ynode is BLACK and znode is right child
znode = znode->parent;
left_rotate(rbtree, znode);
}
/*
if(znode->parent == NULL) {
right_rotate(rbtree, znode);
continue;
}
*/
znode->parent->color = BLACK; //ynode is BLACK and znode is left child
znode->parent->parent->color = RED;
right_rotate(rbtree, znode->parent->parent);
}
} else { //znode's parent is at right
ynode = znode->parent->parent->left; //ynode is znode's uncle
if((ynode != NULL) && (ynode->color == RED)) {
znode->parent->color = BLACK;
ynode->color = BLACK;
znode->parent->parent->color = RED;
znode = znode->parent->parent;
} else {
if(znode == znode->parent->left) {
//error when znode is root, so znode parent is NULL
znode = znode->parent;
right_rotate(rbtree, znode);
}
/*
if(znode->parent == NULL) {
left_rotate(rbtree, znode);
continue;
}
*/
znode->parent->color = BLACK;
znode->parent->parent->color = RED;
left_rotate(rbtree, znode->parent->parent);
}
}
} //end while
rbtree->root->color = BLACK;
rbtree->nil->color = BLACK;
}
//========================================================================
// rb_delete_fixup
// fixup the rbtree when free a blacknode
//========================================================================
void rb_delete_fixup(rbtree_t *rbtree, rbtreenode_t *xnode) {
rbtreenode_t *wnode;
while((xnode != rbtree->root) && (xnode->color == BLACK)) {
if(xnode == xnode->parent->left) {//xnode is left node
wnode = xnode->parent->right;
if(wnode->color == RED) {
wnode->color = BLACK;
xnode->parent->color = RED;
left_rotate(rbtree, xnode->parent);
wnode = xnode->parent->right;
}
//wnode is black
if(wnode->left->color == BLACK && wnode->right->color == BLACK) {
wnode->color = RED;
xnode = xnode->parent;
} else {
if(wnode->right->color == BLACK) {
wnode->left->color = BLACK;
wnode->color = RED;
right_rotate(rbtree, wnode);
wnode = xnode->parent->right;
}
wnode->color = wnode->parent->color;
xnode->parent->color = BLACK;
wnode->right->color = BLACK;
left_rotate(rbtree, xnode->parent);
xnode = rbtree->root;
}
} else { //xnode is right node
wnode = xnode->parent->left;
if(wnode->color == RED) {
wnode->color = BLACK;
xnode->parent->color =RED;
right_rotate(rbtree, xnode->parent);
wnode = xnode->parent->left;
}
if(wnode->left->color == BLACK && wnode->right->color == BLACK) {
wnode->color = RED;
xnode = xnode->parent;
} else {
if(wnode->left->color == BLACK) {
wnode->right->color = BLACK;
wnode->color = RED;
left_rotate(rbtree, wnode);
wnode = xnode->parent->left;
}
wnode->color = wnode->parent->color;
xnode->parent->color = BLACK;
wnode->left->color = BLACK;
right_rotate(rbtree, xnode->parent);
xnode = rbtree->root;
}
}
}
xnode->color = BLACK;
}
//=======================================================================
// rb_delete
// delete znode from rbtree
//=======================================================================
void rb_delete(rbtree_t *rbtree, rbtreenode_t *znode) {
rbtreenode_t *ynode, *xnode;
if(znode->left == rbtree->nil || znode->right == rbtree->nil)
ynode = znode;
else {
ynode = znode->right;
while(ynode->left != rbtree->nil) ynode = ynode->left;//successor
//ynode = tree_successor(znode);
}
//xnode may sentinel???
if(ynode->left != rbtree->nil)
xnode = ynode->left;
else
xnode = ynode->right;
// if(xnode != rbtree->nil)
xnode->parent = ynode->parent;
if(ynode->parent == rbtree->nil)
rbtree->root = xnode;
else {
if(ynode->parent->left == ynode)
ynode->parent->left = xnode;
else
ynode->parent->right = xnode;
}
if (ynode != znode)
znode->value = ynode->value;
if (ynode->color == BLACK)
rb_delete_fixup(rbtree, xnode);
free(ynode);
}
//=================================================================
// rb_inorder
//=================================================================
void rb_inorder(rbtreenode_t *rbtnode, rbtreenode_t *nil) {
if(rbtnode != nil) {
nodecount++;
rb_inorder(rbtnode->left, nil);
printf("< value: %d, color: %d, parent is: %d >/n", rbtnode->value, rbtnode->color, rbtnode->parent->value);
if(rbtnode->color == RED && rbtnode->parent->color == RED) {
printf("error RED duped<%d, %d>", rbtnode->value, rbtnode->parent->value);
exit(0);
}
rb_inorder(rbtnode->right, nil);
}
}
//==================================================================
// main
//==================================================================
int main() {
int n, value;
rbtreenode_t *searchnode;
rbtree_t rbtree, *prbtree;
prbtree = &rbtree;
rbtree_init(prbtree);
// env 1
rbtree_insert(prbtree, 9);
rbtree_insert(prbtree, 1);
rbtree_insert(prbtree, 2);
rbtree_insert(prbtree, 4);
rbtree_insert(prbtree, 8);
rbtree_insert(prbtree, 5);
rbtree_insert(prbtree, 6);
rbtree_insert(prbtree, 3);
rbtree_insert(prbtree, 7);
printf("<inorder the tree>/n");
rb_inorder(prbtree->root, prbtree->nil);
printf("tree node count: %d/n", nodecount);
printf("insert node count: %d/n", nodecount2);
searchnode = rb_search_node(prbtree, 5);
if(!searchnode) {
printf("Can't find the node user give!/n");
exit(0);
}
rb_delete(prbtree, searchnode);
/*
*******************************************************
//env 2
srand(time(NULL));
for(n = 0; n < 999999; n++) {
value = rand() + rand() + rand();
rbtree_insert(prbtree, value);
}
for(n = 0; n < 999999; n++) {
value = rand() + rand() + rand();
rbtree_insert(prbtree, value);
}
//rbtree_insert(prbtree, 253466);
*******************************************************
*/
printf("<after delete inorder the tree>/n");
rb_inorder(prbtree->root, prbtree->nil);
for(n = 0; n < 999; n++) {
value = rand();
rbtree_insert(prbtree, value);
}
searchnode = rb_search_node(prbtree, 6875);
if(!searchnode) {
printf("Can't find the node user give!/n");
exit(0);
}
rb_delete(prbtree, searchnode);
searchnode = rb_search_node(prbtree, 96507);
if(!searchnode) {
printf("Can't find the node user give!/n");
exit(0);
}
rb_delete(prbtree, searchnode);
rb_inorder(prbtree->root, prbtree->nil);
// printf("tree node count: %d/n", nodecount);
// printf("insert node count: %d/n", nodecount2);
}
相关推荐
工业预测模型避坑指南:PHM2012轴承数据实战中,LSTM、CNN、Transformer到底怎么选?
本文深入探讨了工业预测模型在PHM2012轴承数据下的选型策略,对比了LSTM、CNN和Transformer等主流模型在轴承寿命预测任务中的表现。通过真实实验数据,提供了可复现的选型决策框架,帮助工程师根据数据规模、硬件条件和精度要求选择最佳模型。文章还揭示了工程落地中的隐藏陷阱,如数据不均衡和工况迁移挑战,并提出了解决方案。
ngx_rbtree_init
在 2. 代码分析 这段代码是 Nginx 1.24.0 源码中的一个宏定义: ,用于初始化一个红黑树(Red-Black Tree)结构。在 Nginx 中,红黑树是一种高效的自平衡二叉搜索树,常用于定时器管理、缓存索引、等需要快速插入、查找和删除的场景。 这是一个带参数的 C 宏,接受三个参数: 作用:初始化哨兵节点 。 详细说明: 在红黑树实现中,哨兵节点(sentinel) 是一个特殊的“空”节点,通常用作叶子节点的子节点(代替 ),简化边界条件处理。 是另一个宏 哨兵节点不存储实际数据,
allegro 约束管理Constraint Manager(一)
介绍Cadence allegro 约束管理器CM的使用方法。
rbtree 红黑树的 C 语言实现
rbtree 红黑树的 C 语言实现,主要是照搬了《算法导论》,红黑树是一种比较有实用意义的平衡树,不过也挻复杂,主要是利用其它兄弟节点再加以旋转来实现平衡,不过在并发上增删操作不太方便,这时用 skip list 跳跃表有一定的优势。不过用来实现key-->value 数据结构 map , dictation, set 还是不错,现在把源码和测试表如下:/* * rbtree.h * *
手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)
本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。
手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)
本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。
linux内核分析之rbtree的使用
一、理论基础 红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 性质1. 节点是红色或黑色。 性质2. 根是黑色。 性质3. 所有叶子都是黑色(叶子是NIL节点)。 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5. 从任一节点
CentOS Stream 9中安装MySQL的详细步骤
本文详细介绍了在CentOS Stream 9系统中如何进行MySQL的在线安装、离线安装以及忘记密码的恢复操作。通过阅读本文,您将能够了解并掌握在CentOS Stream 9上安装MySQL的步骤,以及在遇到忘记密码的情况下的解决方案。
红黑树rbtree实现,原汁原味nginx。加深理解!
红黑树rbtree实现,原汁原味nginx。加深理解! deepRL 发布时间: 2014/05/27 20:04 阅读: 1117 收藏: 6 点赞: 0 评论: 1 摘要 红黑树作为一种支持快速检索、查找的高效数据结构(平衡二叉树的一种),在nginx的核心模块(定时器、文件缓存模块等)都有应用。 //rbtree.h #ifndef
海康DS-7604N-K1/RTB固件包
【摘要】海康DS-7604N-K1/RTB萤石云设备发布V4.30.091版本升级程序(2022.09.19),仅适用于指定型号。升级前需先升级至V3.4.106基础版本,刷机会重置设备为未激活状态,需重新设置admin密码。该机型支持密码/手势登录,无密码时可通过U盘升级。注意事项:升级存在风险,需确认程序适用性;升级过程严禁断电;必须阅读压缩包内的刷机说明。此为定制机型,非必要不建议升级。(150字)
⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)
本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar
rbtree
一、红黑树6条规则 1.每个节点非黑即红 2.根节点是黑色 3.新插入的节点是红色 4.从根到叶节点的所有路径经历的黑节点个数相等 5.从根到叶节点不存在两个连续红色节点的路径 6.空节点(Aunt节点)是黑色的 二、插入新节点导致红黑树规则冲突后的reblance操作 1.reblance操作分类 1)rotate —— black aunt(受影响的节点parent/grand parent/aunt/self) 2) colorfilp —— ...
C#实现将DataGridView中数据导出到Excel (附完整源码)
C#实现将DataGridView中数据导出到Excel (附完整源码)
C++ STL :红黑树rb_tree源码剖析
STL关联式容器map、set、multimap、multiset,绝大部分操作如插入、修改、删除、搜索,都是由其内含的红黑树来完成的。我下面会总结 STL中rb_tree怎么实现的。首先,rb_tree是红黑树,所以需要定义红色和黑色。然后需要定义 红黑树的节点。_Rb_tree_node_base定义了红黑树的节点类,从类中可以看出一个节点有颜色、父指针、左孩子指针、右孩子指针4个属性。然后定义了几个函数,可以找到以这个节点为根节点的红黑树的最大节点和最小节点。
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
「STL详解」RB-tree 红黑树
RB-tree 红黑树是一种广泛使用的平衡二叉搜索树(BInary Search Tree),也是 SGI STL 为以实现的一种搜索树,作为关联式容器(associated containers)的底部机制。它能确保任何一个节点的左右子树的高度差不会超过二者中较低子树的一倍。 RB-tree 满足以下规则: 每个节点不是红色就是黑色 根节点是黑色 如果节点是红色,其子节点必须为黑 任意节点到 NULL(数尾端)的任何路径,所含黑节点数必须相同 RB-tree 节点设计 RBTree 有红黑两种颜色的节
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
红黑树性质、插入节点和rb_tree容器
文章目录1. RB-tree 性质2. RB-tree 插入3. STL非公开rb_tree容器3.1 rb_tree 数据结构3.2 rb_node 设计实现3.3 __rb_tree_iterator 设计实现 1. RB-tree 性质 RB-tree(红黑树)是一种颇具历史并被广泛运用的平衡二叉树。相比于另一种平衡二叉树AVL-tree,其对平衡性规则的要求要宽松一些,且插入删除操作更便于控制,但是搜寻平均效率几乎相等。所谓RB-tree,不仅是一个二叉搜索树,而且必须满足以下规则: 1. 每
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
红黑树RB-tree
转自http://www.cnblogs.com/zhangchaoyang 红黑树RB-tree RB-tree是满足以下4个条件的二叉查找树: 每个节点不是红色就是黑色根节点为黑色不能存在两个连续的红色节点任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同 红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经
红黑树(rb_tree) 源代码
红黑树 (rb_tree)源代码
C++进阶——STL源码之红黑树(_Rb_tree)
Rb_tree_node的实现如下,几个实现也很简单,在_Rb_tree_node中定义了结点数据域,在基类_Rb_tree_node_base中分别定义了left、right、parent,另外还有一个表示颜色的标记常量。通过获取_M_impl的构造器来完成节点的创建和销毁,这里和我们之前看到的是一致的,内存分配和构造是分开的,在_M_create_node中,先通过构造器去分配,然后通过construct来构造。_Rb_tree_impl还负责红黑树的初始化操作与内存管理。
【STL源码剖析】第五章 关联式容器 之 RB-tree(红黑树)
RB-treeRB-tree不仅是一个二叉搜索树,而且必须满足一些规则:每个节点不是红色就是黑色(图中深色代表黑,浅色代表红)根节点为黑色如果节点为红,其子节点必须为黑任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同根据规则4,新增节点不许为红;根据规则3,新增节点之父节点必须为黑。当新节点根据二叉搜索树的规则到达其插入点,却未能符合上述条件时,就必须调整颜色并旋转树形。插入节点在图...
C++ rb_tree红黑树
在 STL 编程中,容器是我们经常会用到的一种数据结构,容器分为序列式容器和关联式容器。 两者的本质区别在于:序列式容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器则是通过键 (key) 存储和读取元素。 本篇着重剖析关联式容器相关背后的知识点,来一张思维导图 容器分类 前面提到了,根据元素存储方式的不同,容器可分为序列式和关联式,那具体的又有哪些分类呢,这里我画了一张图来看一下。 关联式容器比序列式容器更好理解,从底层实现来分的话,可以分为 RB_tree 还是 hash_table,所有暴
STL浅析 RB-tree(红黑树)
RB-tree(红黑树)是平衡二叉搜索树。RB-tree满足二叉搜索树的规则之外,还遵循以下特性: 每个节点不是红色就是黑色。 根节点为黑色。 如果节点为红色,其子节点必须为黑色。 任意一个节点到到NULL(树尾端)的任何路径,所含之黑色节点数必须相同。 红黑树原理 因为红黑树比较复杂,特别是旋转和变色很难描述,篇幅也会很长,所以这里推荐一下这个视频: 红黑树原理及平衡二叉树旋转详解 RB-t...
红黑树 RB Tree
前言前面我们已经提到过了二叉搜索树和AVL树两种查找树,二叉搜索树最好情况下(为完全二叉树)查找的时间复杂度为O(lgN),最坏情况下(类似于单链表)的时间复杂度为O(N)。而AVL树则是对二叉搜索树的一种优化,他保证一个节点的左右子树的高度差不超过+-1的绝对值,从而减小了一棵树的高度,通过减小树的高度的方式来减小查找数据的时间复杂度。而今天所要提到的红黑树是通过一系列的负责设置确保没有一条路径能
红黑树解析(RB-Tree)
1.RB树需满足的规则 节点非红即黑 根节点为黑 如果节点为红,其儿子必须为黑 任一节点到NULL的任何路径,所含的黑节点必须相同 一般将NULL看为黑节点 2.RB树的插入 2.1 自底向上的插入 插入的新节点为红色,自底向上的插入算法较为复杂,分为四种情况 状况1:P为红,S为黑,【一字型】,单旋,P变为黑色,X和S变为红色 状况2:P为红,S为黑,【之字形】,双旋转 ...
11红黑树(RB-tree)
1、平衡二叉树 平衡二叉树有许多种类型,包括AVL-tree、RB-tree、AA-tree,其中最被广泛运用于STL的是RB-tree(红黑树)。二叉搜索树的节点放置规则是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。 2、AVL-tree AVL-tree是一个“加上了额外平衡条件”的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN)。AVL-tree要求任何节点的左右子树高度相差最多1。由于只有插入点至根节点路径是哪个的各节点可能改变平
深入解剖STL RB-tree(红黑树)
要是下次我发帖没看到你们的转评赞三连,信不信我直接黑进你们公司的代码库,把你们所有的unordered_map全换成手写的冒泡排序?赶紧的,关注点起来,老司机带你们解锁更多在屎山代码里仰望星空的各种姿势!红黑树是相亲,虽然上限不高,但起码对方是个四肢健全的正常人。这就像你在早高峰的地铁上试图吃韭菜盒子,左边挤过来一个大汉,你为了保持平衡就得往右边靠靠,顺便还得把韭菜盒子藏好别蹭人家一身。行了,说了这么多,你们这帮小白要是再搞不懂STL红黑树,干脆趁早转行去卖烤冷面吧。哎不对,刚才说岔了,回来回来。
493



被折叠的 条评论
为什么被折叠?



