RBNode*parent, *left, *right;//指向结点的父结点、左右孩子结点DataType key;//结点数据intcolor;//颜色 红(r) 或黑(b)}RBNode;//定义红黑树结点RBNode Nil; RBNode* nil = &Nil;voidleft_rotate( RBNode * &T, RBNode * x)//左旋 x一定不能有引用 因为如果引用后 x与y->parent就是等价的...
红黑树示意图如下: 红黑树的C实现(代码说明) 红黑树的基本操作是添加、删除和旋转。在对红黑树进行添加或删除后,会用到旋转方法。为什么呢?道理很简单,添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而...
但是那些“遗漏”的情况如果存在的话,操作之前的红黑树将违反那几个规则。 写代码的时候很多次因为少考虑情况而导致错误,细节比较多,刚开始rb_node中没有指向父节点的指针,写的快吐血,然后还是加上了。代码具体的含义可以结合文章和注释来看(还是很好理解的)。下面的代码中可能还有没有考虑到的细节,欢迎拍砖。 1#...
1. 红黑树结构体 //这里偷懒就应0代表黑色,1代表红色了typedefstructRBTreeNode{ int data;//数据域int color;//0黑色 1红色structRBTreeNode*parent;//父亲结点structRBTreeNode*left;//左子结点structRBTreeNode*right;//右子结点} RBTreeNode; 2. 前序遍历 //这里打印了节点的颜色和父节点void preOrder...
红黑树的使用场景非常广泛,比如nginx中用来管理timer、epoll中用红黑树管理事件块(文件描述符)、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、C++STL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景,对于我们面试和工作、以及理解开源代码都是非常有帮助。
2.3.3 完整代码 #include<sys/epoll.h>#include<functional>#include<chrono>#include<set>#include<memory>#include<iostream>usingnamespacestd;structTimerNodeBase{time_texpire;int64_tid;};//公有继承structTimerNode:publicTimerNodeBase{//std::function是一个可调用对象包装器,是一个类模板//相当于 typedef...
用C语言实现红黑树算法。内附完整代码。 大家好,我是贤弟! 一、什么是红黑树? 红黑树是一种自平衡二叉查找树,它能够在O(log n)的时间内完成插入、删除和查找操作。 红黑树的节点有两种颜色:红色和黑色,每个节点都有一个颜色属性。 红黑树满足以下性质:...
红黑树的实现可以分为几个主要部分:定义节点结构、实现插入操作、删除操作以及查找操作。以下是详细的代码示例和说明。 1. 定义节点结构 首先,我们需要定义红黑树的节点结构和红黑树本身的结构。 #include <stdio.h> #include <stdlib.h> typedef enum { RED, BLACK } NodeColor; ...
(这是我提交过的最长代码...1 #include <bits/stdc++.h> 2using namespace std;3#define RED 1 4#define BLACK 0 5#define RBnode node<T> * 6 7 template <class T> 8struct node { 9 T key;10int sum; //sum⼦树节点数 11bool color;12 node *p, *left, *right;13 node() ...
小技巧:宏封装测试代码: #defineKEY(n) (n ? n->key : 0)#defineCNT(n) (n ? n->cnt : 0)#defineTEST(func) { \ while (~scanf("%d", &key)) { \ if (key == -1) break; \ root = func(root, key); \ printf("\n=== %s %d to BST\n", #func, key); \ output...