您的位置:首页 > 其它

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是需要删除的节点指针删除节点,自动旋转保持特性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: