这是我参与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 ()。