ngx_rbtree_t红黑树
2015-07-24 21:29
232 查看
ngx_rbtree_t红黑树
红黑树的特性
节点是红色或黑色;根节点是黑色;
所有叶子节点都是黑色(即NIL哨兵节点);
每个红色节点的两个子节点都是黑色;
从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点。
红黑树节点结构体
typedef ngx_uint_t ngx_rbtree_key_t; typedef struct ngx_rbtree_node_s ngx_rbtree_node_t; struct struct ngx_rbtree_node_s { //无符号整型关键字 ngx_rbtree_key_t key; //左子节点 ngx_rbtree_node_t *left; //右子节点 ngx_rbtree_node_t *right; //父节点 ngx_rbtree_node_t *parent; //节点的颜色,0:黑,1:红 u_char color; //仅一字节的数据 u_char data; };
将这样的树节点放在元素的第一个成员位置,这样方便直接强制转换。
i.e.
typedef struct { ngx_rbtree_node_t node; ngx_uint_t num; }TestRBTreeBode;
红黑树节点提供的函数
函数名 | 参数含义 | 执行意义 |
---|---|---|
ngx_rbt_red(node) | node是ngx_rbtree_node_t类型的节点指针 | 设置node为红色 |
ngx_rbt_black(node) | node是ngx_rbtree_node_t类型的节点指针 | 设置node为黑色 |
ngx_rbt_is_red(node) | node是ngx_rbtree_node_t类型的节点指针 | 判断node是否为红色 |
ngx_rbt_is_black(node) | node是ngx_rbtree_node_t类型的节点指针 | 判断node是否为黑色 |
ngx_rbt_copy_color(n1,n2) | n1、n2同上 | 将n2的节点颜色复制给n1 |
ngx_rbtree_node_t *ngx_rbtree_min(node,sentinel) | node、sentinel都是ngx_rbtree_node_t *类型 | 找到当前节点及其子树中的最小节点(按照key) |
ngx_rbtree_sentinel_init(node) | node同上 | 初始化哨兵节点 |
红黑树结构体
typedef struct ngx_rbtree_s ngx_rbtree_t; /* 为解决不同节点含有相同关键字的元素冲突问题所存在的指针*/ typedef void (*ngx_rbtree_insert_pt)(ngx_rbtree_node_t *root,ngx_rbtree_node_t *node,ngx_rbtreenode_t *sentinel); struct ngx_rbtree_s { //指向树的根节点(可以直接强制转化为数据元素) ngx_rbtree_node_t *root; //指向NIL哨兵节点 ngx_rbtree_node_t *sentinel; //红黑树添加元素的指针 ngx_rbtree_insert_pt insert; };
红黑树容器提供的函数
函数名 | 参数含义 | 执行意义 |
---|---|---|
ngx_rbtree_init(tree,s,i) | tree是容器指针;s是哨兵指针;i是ngx_rbtree_insert_pt类型的添加函数 | 初始化红黑树 |
void ngx_rbtree_insert(ngx_rbtree_t *tree,ngx_rbtree_node_t *node) | tree同上;node是添加的节点指针 | 添加节点,自动旋转保持特性 |
void ngx_rbtree_delete(ngx_rbtree_t *tree,ngx_rbtree_node_t *node) | tree同上;node是需要删除的节点指针 | 删除节点,自动旋转保持特性 |
相关文章推荐
- hadoop开发:eclipse运行wordcount实例
- 利用getViewTreeObserver().addOnGlobalLayoutListener()获得一个视图的高度
- hdoj1002 A + B Problem II 初学大数相加
- 构造函数为什么不能是虚函数
- Android—开发自学历程(1)-Intent-第二个Activity
- 2015 HUAS Summer Training#2~D
- HDU5301
- [Leetcode 79, Medium] Word Search
- 单片机---串口打印字符串时,只显示第一个字符
- Android事件处理
- Leetcode Shortest Palindrome (最短回文串)
- How to Compile Java DBus
- [leedcode 126] Word Ladder
- 平衡的括号(名字怪怪的~)
- 关于shell排序
- Day_02_数据库的简单连接和添加数据
- 默默重新开始,第一页也是新的一页
- 自动机,状态机,有限自动机,有限状态机,有限状态自动机,非确定下有限状态自动,确定性有限状态自动机的区别于联系
- Project Euler:Problem 90 Cube digit pairs
- 它们的定义android滑动菜单