aboutsummaryrefslogtreecommitdiff
path: root/source/tree.c
diff options
context:
space:
mode:
authornodist <kevin.comas.git@gmail.com>2026-10-08 10:51:06 -0400
committernodist <kevin.comas.git@gmail.com>2026-10-08 10:51:06 -0400
commit4ee5b8d6a9ebf49ce30ff7d93ef7401039ffecc6 (patch)
tree078db7e96e65f29ce42c440749bbde8a9bfae1b2 /source/tree.c
parentcbf7d62712c44d2b3bbb066e6840041b89cfb6d9 (diff)
impl kpl tree test with c strings
Diffstat (limited to 'source/tree.c')
-rw-r--r--source/tree.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/source/tree.c b/source/tree.c
index 964899f..1fbd980 100644
--- a/source/tree.c
+++ b/source/tree.c
@@ -4,12 +4,17 @@
extern inline void kpl_tree_init(kpl_tree *tree, kpl_tree_node_compare_fn node_compare_fn,
kpl_tree_node_free_fn node_free_fn);
-static void kpl_tree_free_helper(kpl_tree_node *node, kpl_tree_node_free_fn node_free_fn) {
- if (node->tree_left)
- kpl_tree_free_helper(node->tree_left, node_free_fn);
- if (node->tree_right)
- kpl_tree_free_helper(node->tree_right, node_free_fn);
- node_free_fn(node);
+static void kpl_tree_free_helper(kpl_tree_node *root_node, kpl_tree_node_free_fn node_free_fn) {
+ if (!root_node)
+ return;
+ while (root_node->tree_duplicates) {
+ kpl_tree_node *tmp_node = root_node->tree_duplicates;
+ root_node->tree_duplicates = root_node->tree_duplicates->tree_duplicates;
+ node_free_fn(tmp_node);
+ }
+ kpl_tree_free_helper(root_node->tree_left, node_free_fn);
+ kpl_tree_free_helper(root_node->tree_right, node_free_fn);
+ node_free_fn(root_node);
}
void kpl_tree_free(kpl_tree *tree) {
@@ -93,5 +98,8 @@ static kpl_tree_node *kpl_tree_insert_helper(kpl_tree_node *restrict root_node,
}
void kpl_tree_insert(kpl_tree *tree, void *insert_node) {
+ kpl_tree_node *node = insert_node;
+ node->tree_left = node->tree_right = node->tree_duplicates = NULL;
+ node->tree_height = KPL_TREE_TREE_HEIGHT_INIT;
tree->root_node = kpl_tree_insert_helper(tree->root_node, insert_node, tree->node_compare_fn);
}