From f2c20e8a15bfc98cc82b4270bb5a086239d487f2 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Thu, 19 Jan 2023 22:45:22 +0100 Subject: [PATCH] wip bin tree remove --- src/tree/node.c | 54 ++++++++++++++++++++++++++++++++---- src/tree/node.h | 5 ++++ test/tree/test_binary_tree.c | 2 ++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/tree/node.c b/src/tree/node.c index 935a56d..a154819 100644 --- a/src/tree/node.c +++ b/src/tree/node.c @@ -15,7 +15,7 @@ vieter_tree_error vieter_tree_node_insert(vieter_tree_node *node, uint64_t key, parent = node; - if (key < node->key) { + if (key < parent->key) { node = parent->left; } else { node = parent->right; @@ -27,7 +27,7 @@ vieter_tree_error vieter_tree_node_insert(vieter_tree_node *node, uint64_t key, new_node->data = data; new_node->parent = parent; - if (key < node->key) { + if (key < parent->key) { parent->left = new_node; } else { parent->right = new_node; @@ -36,11 +36,10 @@ vieter_tree_error vieter_tree_node_insert(vieter_tree_node *node, uint64_t key, return vieter_tree_ok; } -vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *node, - uint64_t key) { +vieter_tree_error vieter_tree_node_search_node(vieter_tree_node **out, vieter_tree_node *node, uint64_t key) { while (node != NULL) { if (node->key == key) { - *out = node->data; + *out = node; return vieter_tree_ok; } @@ -55,7 +54,50 @@ vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *node, return vieter_tree_not_present; } +vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *node, + uint64_t key) { + vieter_tree_node *target; + vieter_tree_error res = vieter_tree_node_search_node(&target, node, key); + + if (res != vieter_tree_ok) { + return res; + } + + *out = target->data; + + return vieter_tree_ok; +} + +vieter_tree_node *vieter_tree_node_successor(vieter_tree_node *node) { + if (node->left != NULL ^ node->right != NULL) { + return node->left != NULL ? node-> left : node->right; + } + + node = node->right; + + while (node->left != NULL) { + node = node->left; + } + + return node; +} + +void vieter_tree_node_replace(vieter_tree_node *to_replace, vieter_tree_node *replacement) { + +} + vieter_tree_error vieter_tree_node_remove(void **out, vieter_tree_node *node, uint64_t key) { - return vieter_tree_not_present; + vieter_tree_node *target; + vieter_tree_error res = vieter_tree_node_search_node(&target, node, key); + + if (res != vieter_tree_ok) { + return res; + } + + *out = target->data; + + if (target->left == NULL && target->right == NULL) { + + } } diff --git a/src/tree/node.h b/src/tree/node.h index f22a965..b89d0c5 100644 --- a/src/tree/node.h +++ b/src/tree/node.h @@ -16,8 +16,13 @@ vieter_tree_node *vieter_tree_node_init(); vieter_tree_error vieter_tree_node_insert(vieter_tree_node *node, uint64_t key, void *data); +vieter_tree_error vieter_tree_node_search_node(vieter_tree_node **out, vieter_tree_node *node, uint64_t key); vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *node, uint64_t key); vieter_tree_error vieter_tree_node_remove(void **out, vieter_tree_node *node, uint64_t key); +vieter_tree_node *vieter_tree_node_successor(vieter_tree_node *node); + +void vieter_tree_node_replace(vieter_tree_node *to_replace, vieter_tree_node *replacement); + #endif diff --git a/test/tree/test_binary_tree.c b/test/tree/test_binary_tree.c index fd6bb1b..e9858ff 100644 --- a/test/tree/test_binary_tree.c +++ b/test/tree/test_binary_tree.c @@ -28,5 +28,7 @@ void test_insert() { } TEST_LIST = { + {"test_init", test_init}, + {"test_insert", test_insert}, {NULL, NULL} };