From a704fe5cfee5e96ee63f355e93180a1f1be10781 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Tue, 26 Jul 2022 10:29:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=9C=AA=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2delete=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/common/bitree.c | 24 ++++++++++++++++++++---- kernel/common/bitree.h | 23 +++++++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/kernel/common/bitree.c b/kernel/common/bitree.c index 67fca5c9..e3273814 100644 --- a/kernel/common/bitree.c +++ b/kernel/common/bitree.c @@ -12,9 +12,10 @@ * * @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)(struct bt_node_t *a, struct bt_node_t *b)) +struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(struct bt_node_t *a, struct bt_node_t *b), int (*release)(void *value)) { if (node == NULL || cmp == NULL) return -EINVAL; @@ -23,6 +24,8 @@ struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(struct bt_no memset((void *)root, 0, sizeof(struct bt_root_t)); root->bt_node = node; root->cmp = cmp; + root->release = release; + root->size = (node == NULL) ? 0 : 1; return root; } @@ -86,7 +89,7 @@ int bt_insert(struct bt_root_t *root, void *value) else last_node->right = insert_node; } - + ++root->size; return 0; failed:; @@ -136,8 +139,8 @@ static struct bt_node_t *bt_get_minimum(struct bt_node_t *this_node) /** * @brief 删除结点 - * - * @param root 树根 + * + * @param root 树根 * @param value 待删除结点的值 * @return int 返回码 */ @@ -181,6 +184,19 @@ int bt_delete(struct bt_root_t *root, void *value) to_delete->parent->right = to_delete_son; } + --root->size; // 释放最终要删除的结点的对象 kfree(to_delete); +} + +/** + * @brief 释放整个二叉搜索树 + * + * @param root 树的根节点 + * @return int 错误码 + */ +int bt_destroy_tree(struct bt_root_t *root) +{ + // todo: 待kfifo完成后,使用kfifo队列来辅助destroy + return -1; } \ No newline at end of file diff --git a/kernel/common/bitree.h b/kernel/common/bitree.h index 3224635f..ef6565a0 100644 --- a/kernel/common/bitree.h +++ b/kernel/common/bitree.h @@ -13,6 +13,7 @@ struct bt_node_t struct bt_root_t { struct bt_node_t *bt_node; + int32_t size; // 树中的元素个数 int (*cmp)(struct bt_node_t *a, struct bt_node_t *b); // 比较函数 a>b 返回1, a==b返回0, a