mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 19:36:47 +00:00
79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
#pragma once
|
||
#include <common/glib.h>
|
||
|
||
struct bt_node_t
|
||
{
|
||
struct bt_node_t *left;
|
||
struct bt_node_t *right;
|
||
struct bt_node_t *parent;
|
||
void *value; // 数据
|
||
|
||
} __attribute__((aligned(sizeof(long))));
|
||
|
||
struct bt_root_t
|
||
{
|
||
struct bt_node_t *bt_node;
|
||
int32_t size; // 树中的元素个数
|
||
int (*cmp)(void *a, void *b); // 比较函数 a>b 返回1, a==b返回0, a<b返回-1
|
||
/**
|
||
* @brief 释放结点的value的函数
|
||
* @param value 结点的值
|
||
*/
|
||
int (*release)(void *value);
|
||
};
|
||
|
||
/**
|
||
* @brief 创建二叉搜索树
|
||
*
|
||
* @param node 根节点
|
||
* @param cmp 比较函数
|
||
* @param release 用来释放结点的value的函数
|
||
* @return struct bt_root_t* 树根结构体
|
||
*/
|
||
struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(void *a, void *b), int (*release)(void *value));
|
||
|
||
/**
|
||
* @brief 创建结点
|
||
*
|
||
* @param left 左子节点
|
||
* @param right 右子节点
|
||
* @param value 当前节点的值
|
||
* @return struct bt_node_t*
|
||
*/
|
||
struct bt_node_t *bt_create_node(struct bt_node_t *left, struct bt_node_t *right, struct bt_node_t *parent, void *value);
|
||
|
||
/**
|
||
* @brief 插入结点
|
||
*
|
||
* @param root 树根结点
|
||
* @param value 待插入结点的值
|
||
* @return int 返回码
|
||
*/
|
||
int bt_insert(struct bt_root_t *root, void *value);
|
||
|
||
/**
|
||
* @brief 搜索值为value的结点
|
||
*
|
||
* @param root 树根结点
|
||
* @param value 值
|
||
* @param ret_addr 返回的结点基地址
|
||
* @return int 错误码
|
||
*/
|
||
int bt_query(struct bt_root_t *root, void *value, uint64_t *ret_addr);
|
||
|
||
/**
|
||
* @brief 删除结点
|
||
*
|
||
* @param root 树根
|
||
* @param value 待删除结点的值
|
||
* @return int 返回码
|
||
*/
|
||
int bt_delete(struct bt_root_t *root, void *value);
|
||
|
||
/**
|
||
* @brief 释放整个二叉搜索树
|
||
*
|
||
* @param root
|
||
* @return int
|
||
*/
|
||
int bt_destroy_tree(struct bt_root_t *root); |