ngx_rbtree_t红黑树
ngx_rbtree_t红黑树
红黑树的特性
- 节点是红色或黑色;
- 根节点是黑色;
- 所有叶子节点都是黑色(即NIL哨兵节点);
- 每个红色节点的两个子节点都是黑色;
- 从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点。
红黑树节点结构体
<code><span>typedef</span> ngx_uint_t ngx_rbtree_key_t; <span>typedef</span><span>struct</span> ngx_rbtree_node_s ngx_rbtree_node_t; <span>struct</span><span>struct</span> ngx_rbtree_node_s { <span>//无符号整型关键字</span> ngx_rbtree_key_t key; <span>//左子节点</span> ngx_rbtree_node_t *left; <span>//右子节点</span> ngx_rbtree_node_t *right; <span>//父节点</span> ngx_rbtree_node_t *parent; <span>//节点的颜色,0:黑,1:红</span> u_char color; <span>//仅一字节的数据</span> u_char data; };</code>
将这样的树节点放在元素的第一个成员位置,这样方便直接强制转换。
i.e.
<code><span>typedef</span><span>struct</span> { ngx_rbtree_node_t node; ngx_uint_t num; }TestRBTreeBode;</code>
红黑树节点提供的函数
函数名 | 参数含义 | 执行意义 |
---|---|---|
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同上 | 初始化哨兵节点 |
红黑树结构体
<code><span>typedef</span><span>struct</span> ngx_rbtree_s ngx_rbtree_t; <span>/* 为解决不同节点含有相同关键字的元素冲突问题所存在的指针*/</span><span>typedef</span><span>void</span> (*ngx_rbtree_insert_pt)(ngx_rbtree_node_t *root,ngx_rbtree_node_t *node,ngx_rbtreenode_t *sentinel); <span>struct</span> ngx_rbtree_s { <span>//指向树的根节点(可以直接强制转化为数据元素)</span> ngx_rbtree_node_t *root; <span>//指向NIL哨兵节点</span> ngx_rbtree_node_t *sentinel; <span>//红黑树添加元素的指针</span> ngx_rbtree_insert_pt insert; };</code>
红黑树容器提供的函数
函数名 | 参数含义 | 执行意义 |
---|---|---|
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是需要删除的节点指针 | 删除节点,自动旋转保持特性 |
版权声明:Pain is just in your mind.
以上就介绍了ngx\_rbtree_t红黑树,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

nvm删除node的方法:1、下载“nvm-setup.zip”并将其安装在C盘;2、配置环境变量,并通过“nvm -v”命令查看版本号;3、使用“nvm install”命令安装node;4、通过“nvm uninstall”命令删除已安装的node即可。

怎么处理文件上传?下面本篇文章给大家介绍一下node项目中如何使用express来处理文件的上传,希望对大家有所帮助!

本篇文章给大家分享Node的进程管理工具“pm2”,聊聊为什么需要pm2、安装和使用pm2的方法,希望对大家有所帮助!

PiNetwork节点详解及安装指南本文将详细介绍PiNetwork生态系统中的关键角色——Pi节点,并提供安装和配置的完整步骤。Pi节点在PiNetwork区块链测试网推出后,成为众多先锋积极参与测试的重要环节,为即将到来的主网发布做准备。如果您还不了解PiNetwork,请参考Pi币是什么?上市价格多少?Pi用途、挖矿及安全性分析。什么是PiNetwork?PiNetwork项目始于2019年,拥有其专属加密货币Pi币。该项目旨在创建一个人人可参与

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node项目打包为可执行文件的方法,希望对大家有所帮助!

npm node gyp失败是因为“node-gyp.js”跟“Node.js”版本不匹配,其解决办法:1、通过“npm cache clean -f”清除node缓存;2、通过“npm install -g n”安装n模块;3、通过“n v12.21.0”命令安装“node v12.21.0”版本即可。

身份验证是任何Web应用程序中最重要的部分之一。本教程讨论基于令牌的身份验证系统以及它们与传统登录系统的区别。在本教程结束时,您将看到一个用Angular和Node.js编写的完整工作演示。传统身份验证系统在继续基于令牌的身份验证系统之前,让我们先看一下传统的身份验证系统。用户在登录表单中提供用户名和密码,然后点击登录。发出请求后,通过查询数据库在后端验证用户。如果请求有效,则使用从数据库中获取的用户信息创建会话,然后在响应头中返回会话信息,以便将会话ID存储在浏览器中。提供用于访问应用程序中受

什么是单点登录系统?用nodejs怎么实现?下面本篇文章给大家介绍一下使用node实现单点登录系统的方法,希望对大家有所帮助!
