1 #pragma once
2 #include <common/glib.h>
3 
4 struct bt_node_t
5 {
6     struct bt_node_t *left;
7     struct bt_node_t *right;
8     struct bt_node_t *parent;
9     void *value; // 数据
10 
11 } __attribute__((aligned(sizeof(long))));
12 
13 struct bt_root_t
14 {
15     struct bt_node_t *bt_node;
16     int32_t size;                 // 树中的元素个数
17     int (*cmp)(void *a, void *b); // 比较函数   a>b 返回1, a==b返回0, a<b返回-1
18     /**
19      * @brief 释放结点的value的函数
20      * @param value 结点的值
21      */
22     int (*release)(void *value);
23 };
24 
25 /**
26  * @brief 创建二叉搜索树
27  *
28  * @param node 根节点
29  * @param cmp 比较函数
30  * @param release 用来释放结点的value的函数
31  * @return struct bt_root_t* 树根结构体
32  */
33 struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(void *a, void *b), int (*release)(void *value));
34 
35 /**
36  * @brief 创建结点
37  *
38  * @param left 左子节点
39  * @param right 右子节点
40  * @param value 当前节点的值
41  * @return struct bt_node_t*
42  */
43 struct bt_node_t *bt_create_node(struct bt_node_t *left, struct bt_node_t *right, struct bt_node_t *parent, void *value);
44 
45 /**
46  * @brief 插入结点
47  *
48  * @param root 树根结点
49  * @param value 待插入结点的值
50  * @return int 返回码
51  */
52 int bt_insert(struct bt_root_t *root, void *value);
53 
54 /**
55  * @brief 搜索值为value的结点
56  *
57  * @param root 树根结点
58  * @param value 值
59  * @param ret_addr 返回的结点基地址
60  * @return int 错误码
61  */
62 int bt_query(struct bt_root_t *root, void *value, uint64_t *ret_addr);
63 
64 /**
65  * @brief 删除结点
66  *
67  * @param root 树根
68  * @param value 待删除结点的值
69  * @return int 返回码
70  */
71 int bt_delete(struct bt_root_t *root, void *value);
72 
73 /**
74  * @brief 释放整个二叉搜索树
75  *
76  * @param root
77  * @return int
78  */
79 int bt_destroy_tree(struct bt_root_t *root);