浅析常见开源库中红黑树的实现(1)

777 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

Linux

rbtree

实现方式:

typedef struct RBTreeNodeRec_ RBTreeNode;struct RBTreeNodeRec_ {
    unsigned char color;
    int key;
    union {
        void *data;
        char *str;
    };
    RBTreeNode *parent, *left, *right;
};
​
typedef struct RBTreeRec_ {
    int total_node;
    int(*compare)(void*, const void*);
    void(*destroy)(void*);
    RBTreeNode *root;
} RBTree;
​

使用场景

void RBTree_Init(RBTree *rbt); //初始化红黑树  
void RBTree_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); //插入新的结点 
int  RBTree_Erase(RBTree *rbt, int key); //删除红黑树中的结点  
void RBTree_EraseNode(RBTree *rbt, RBTreeNode *node); //按结点删除红黑树 
int  RBTree_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); //按指定数据插入 

参考:

Glib

Balanced Binary Trees

GTree 结构及其相关函数提供了按顺序搜索和遍历的优化键/值对的排序集合。这意味着 GTree 上的大多数操作(访问、搜索、插入、删除、 ...)的平均值为 o(log (n)) ,最糟糕的情况是时间复杂度为o(n)。但是,请注意,维护一个平衡排序的 n 元素 GTree 是在时间 o(nlog(n))中完成的。

实现方式:

typedef struct _GTree GTree;
typedef struct _GTreeNode GTreeNode;
/**
 * GTree:
 *
 * The GTree struct is an opaque data structure representing a
 * [balanced binary tree][glib-Balanced-Binary-Trees]. It should be
 * accessed only by using the following functions.
 */
struct _GTree
{
  GTreeNode        *root;
  GCompareDataFunc  key_compare;
  GDestroyNotify    key_destroy_func;
  GDestroyNotify    value_destroy_func;
  gpointer  key_compare_data;
  guint     nnodes;
  gint      ref_count;
};
​
struct _GTreeNode
{
  gpointer   key; /* key for this node */
  gpointer   value;       /* value stored at this node */
  GTreeNode *left;        /* left subtree */
  GTreeNode *right;       /* right subtree */
  gint8      balance;     /* height (right) - height (left) */
  guint8     left_child;
  guint8     right_child;
};

使用场景

  • 使用 g_tree_new ()创建一个新的 GTree。
  • 在 GTree 中插入键/值对,使用 g_tree_insert (),开销未(o (n log (n))),。
  • 要删除一个键/值对,可以使用 g_tree_remove (),(o (n log (n)))。
  • 若要查找与给定键对应的值,请使用 g_tree_lookup ()g_tree_lookup_extended ()
  • 若要查找 GTree 中的节点数,请使用 g_tree_nnodes ()。若要获得 GTree 的高度,请使用 g_tree_height ()
  • 要遍历 GTree,请为遍历中访问过的每个节点调用一个函数,使用 g_tree_foreach ()
  • 要销毁一棵 GTree,使用 g_tree_destroy ()