红黑树的几种实现方式和比较 (1):需求分析

387 阅读4分钟

这是我参与新手入门的第1篇文章

由于需要重构红黑树的实现,所以现在需要比较集中常见的红黑树实现并比较。

计划分为以下几个部分

  1. 红黑树的需求分析
  2. 常见的红黑树实现分析
    1. Linux rbtree
    2. STL rbtree
    3. ngnix rbtree
    4. ...
  3. 比较并选择较好的红黑树实现
  4. 动手实现

这篇是第一部分,红黑树的需求分析。

一、红黑树的定义

开始分析比较实现方法之前,还是要简单带一遍定义

定义 一棵二叉查找树如果满足下列性质, 则称为红黑树: (1) 每个结点或是红色的, 或是黑色的 (增加一位表示颜色的存储位) ; (2) 每个叶结点 (空指针NIL) 是黑色的; (3) 如果一个结点是红色的, 则它的儿子应是黑色的; (4) 从任一给定结点到其子孙叶结点的每条简单路径上都具有相同个数的黑结点。

img

(图片来自30张图带你彻底理解红黑树 - 简书 (jianshu.com)

二、现有函数概要:

限定符和类型函数和说明
voidRBTree_Init(RBTree *rbt);
初始化红黑树
voidRBTree_Destroy(RBTree *rbt);
销毁红黑树
RBTreeNode *RBTree_First(const RBTree *rbt);
获取第一个结点
RBTreeNode *RBTree_Next(const RBTreeNode *node);
获取下一个结点
RBTreeNode *RBTree_Search(RBTree* rbt, int key);
红黑树查找结点
void*RBTree_GetData(RBTree* rbt, int key);
红黑树查找结点并获取该节点数据
RBTreeNode *RBTree_Insert(RBTree *rbt, int key, void *data);
插入新的结点
intRBTree_Erase(RBTree *rbt, int key);
删除红黑树中的结点
voidRBTree_EraseNode(RBTree *rbt, RBTreeNode *node);
按结点删除红黑树
intRBTree_CustomErase(RBTree *rbt, const void *keydata);
按指定数据删除结点
RBTreeNode *RBTree_CustomSearch(RBTree* rbt, const void *keydata);
红黑树按指定数据查找结点
void*RBTree_CustomGetData(RBTree* rbt, const void *keydata);
获取指定结点数据
RBTreeNode *RBTree_CustomInsert(RBTree *rbt, const void *keydata, void *data);
按指定数据插入

RBTree_Init

void RBTree_Init(RBTree *rbt);

初始化

参数说明:

  • rbt -目标红黑树

返回说明:

RBTree_Destroy

void RBTree_Destroy(RBTree *rbt);

销毁红黑树

参数说明:

  • rbt -目标红黑树

返回说明:

RBTree_First

 RBTreeNode *RBTree_First(const RBTree *rbt);

返回红黑树的第一个结点

参数说明:

  • rbt -目标红黑树

返回说明:

  • 返回第一红黑树结点

RBTree_Next

RBTreeNode *RBTree_Next(const RBTreeNode *node);

返回红黑树的下一个结点

参数说明:

  • node -红黑树结点

返回说明:

  • 返回输入结点的下个结点

RBTree_Search

RBTreeNode* RBTree_Search(RBTree* rbt, int key);

调用rb_search_auxiliary()搜索红黑树

参数说明:

  • rbt -目标红黑树
  • key -搜索的序号

返回说明:

  • 返回找到的结点

RBTree_GetData

void* RBTree_GetData(RBTree* rbt, int key);

调用rb_search_auxiliary()搜索红黑树找到指定 结点并返回其数据。

参数说明:

  • rbt -目标红黑树
  • key -搜索的序号

返回说明:

  • 返回找到的结点的(void*) 的数据

RBTree_Insert

RBTreeNode* RBTree_Insert(RBTree *rbt, int key, void *data);

插入新 结点

参数说明:

  • rbt -目标红黑树
  • key -搜索的序号
  • rbt -新 结点的值

返回说明:

  • 返回插入的结点

RBTree_Erase

int RBTree_Erase(RBTree *rbt, int key);

按序号删除结点

参数说明:

  • rbt -目标红黑树
  • key -搜索的结点序号

返回说明:

  • 成功返回0,失败返回-1

RBTree_EraseNode

void RBTree_EraseNode(RBTree *rbt, RBTreeNode *node);

按结点删除结点

参数说明:

  • rbt -目标红黑树
  • node -目标结点

返回说明:

RBTree_CustomErase

  int RBTree_CustomErase(RBTree *rbt, const void *keydata);

自定义操作-按关键数据删除结点

参数说明:

  • rbt -目标红黑树
  • keydata -目标数据

返回说明:

  • 成功返回0,失败返回-1

RBTree_CustomSearch

  RBTreeNode* RBTree_CustomSearch(RBTree* rbt, const void *keydata);

自定义操作-按关键数据搜索结点

参数说明:

  • rbt -目标红黑树
  • keydata -目标数据

返回说明:

  • 返回找到的结点,未找到返回null

RBTree_CustomGetData

  void* RBTree_CustomGetData(RBTree* rbt, const void *keydata);

自定义操作-按关键数据搜索结点返回其值

参数说明:

  • rbt -目标红黑树
  • keydata -目标数据

返回说明:

  • 返回找到的结点返回其值

RBTree_CustomInsert

  RBTreeNode* RBTree_CustomInsert(RBTree *rbt, const void *keydata, void *data);

自定义操作-按关键数据插入结点

参数说明:

  • rbt -目标红黑树
  • keydata -目标数据
  • data -插入数据

返回说明:

  • 返回新插入的结点

总结:

通过需求分析,我清楚的了解到我需要具体管血哪些操作,和具体的输入输出,我将在接下来的源码分析中进一步关注如何实现这些操作。