aboutsummaryrefslogtreecommitdiff
path: root/source/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tree.c')
-rw-r--r--source/tree.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/source/tree.c b/source/tree.c
new file mode 100644
index 0000000..dcae485
--- /dev/null
+++ b/source/tree.c
@@ -0,0 +1,37 @@
+
+#include "kpl.h"
+
+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);
+}
+
+void kpl_tree_free(kpl_tree *tree) {
+ kpl_tree_free_helper(tree->root_node, tree->node_free_fn);
+}
+
+static void *kpl_tree_find_helper(kpl_tree_node *root_node, const void *find_node,
+ kpl_tree_node_compare_fn compare_fn) {
+ if (!root_node)
+ return NULL;
+ int32_t compare = compare_fn(root_node, find_node);
+ if (compare < 0)
+ return kpl_tree_find_helper(root_node->tree_left, find_node, compare_fn);
+ if (compare > 0)
+ return kpl_tree_find_helper(root_node->tree_right, find_node, compare_fn);
+ return root_node;
+}
+
+void *kpl_tree_find(kpl_tree *tree, const void *find_node) {
+ return kpl_tree_find_helper(tree->root_node, find_node, tree->node_compare_fn);
+}
+
+void kpl_tree_insert(kpl_tree *tree, void *insert_node) {
+ // TODO
+}