From dab5f6a9b2aca8eae8e8f5cca5ff924b4fbad1d6 Mon Sep 17 00:00:00 2001 From: Mineplay Date: Sun, 31 Aug 2025 10:46:08 -0500 Subject: [PATCH] feat(search tree): added utility functions to search tree --- Include/Fledasty/Trees/BinarySearchTree.h | 64 ++++++++++++++++------- Tests/Main.c | 4 ++ 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/Include/Fledasty/Trees/BinarySearchTree.h b/Include/Fledasty/Trees/BinarySearchTree.h index 35fa82e..6feb826 100644 --- a/Include/Fledasty/Trees/BinarySearchTree.h +++ b/Include/Fledasty/Trees/BinarySearchTree.h @@ -33,26 +33,29 @@ #include "../Utils/Error.h" -#define FLEDASTY_BINARY_SEARCH_TREE_DEFINE(key_type, value_type, name) \ -typedef struct FledastyBinarySearchTreeNode_##name { \ - key_type key; \ - value_type value; \ - \ - struct FledastyBinarySearchTreeNode_##name *parent, *left, *right; \ -} FledastyBinarySearchTreeNode_##name; \ - \ -typedef struct { \ - size_t size, depth; \ - FledastyBinarySearchTreeNode_##name *top; \ -} FledastyBinarySearchTree_##name; \ - \ -FledastyError fledasty_binary_search_tree_##name##_free(FledastyBinarySearchTree_##name *current_binary_search_tree); \ - \ -FledastyError fledasty_binary_search_tree_##name##_insert(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key, value_type value); \ -FledastyError fledasty_binary_search_tree_##name##_get(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key, value_type *out); \ -FledastyError fledasty_binary_search_tree_##name##_remove(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key); \ - \ -FledastyError fledasty_binary_search_tree_##name##_in_order_traversal(FledastyBinarySearchTree_##name *current_binary_search_tree, FledastyBinarySearchTreeNode_##name ***out); +#define FLEDASTY_BINARY_SEARCH_TREE_DEFINE(key_type, value_type, name) \ +typedef struct FledastyBinarySearchTreeNode_##name { \ + key_type key; \ + value_type value; \ + \ + struct FledastyBinarySearchTreeNode_##name *parent, *left, *right; \ +} FledastyBinarySearchTreeNode_##name; \ + \ +typedef struct { \ + size_t size, depth; \ + FledastyBinarySearchTreeNode_##name *top; \ +} FledastyBinarySearchTree_##name; \ + \ +FledastyError fledasty_binary_search_tree_##name##_free(FledastyBinarySearchTree_##name *current_binary_search_tree); \ + \ +FledastyError fledasty_binary_search_tree_##name##_insert(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key, value_type value); \ +FledastyError fledasty_binary_search_tree_##name##_get(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key, value_type *out); \ +FledastyError fledasty_binary_search_tree_##name##_remove(FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key); \ + \ +FledastyError fledasty_binary_search_tree_##name##_in_order_traversal(FledastyBinarySearchTree_##name *current_binary_search_tree, FledastyBinarySearchTreeNode_##name ***out); \ + \ +bool fledasty_binary_search_tree_##name##_has_key(const FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key); \ +static inline bool fledasty_binary_search_tree_##name##_is_empty(const FledastyBinarySearchTree_##name *current_binary_search_tree) { return current_binary_search_tree == NULL || current_binary_search_tree->size == 0; } #define FLEDASTY_BINARY_SEARCH_TREE_IMPLEMENT(key_type, value_type, name, compare_key_function, key_less_than_function) \ FledastyError fledasty_binary_search_tree_##name##_free(FledastyBinarySearchTree_##name *current_binary_search_tree) { \ @@ -262,6 +265,27 @@ FledastyError fledasty_binary_search_tree_##name##_in_order_traversal(FledastyBi } \ \ return FLEDASTY_ERROR_NONE; \ +} \ + \ +bool fledasty_binary_search_tree_##name##_has_key(const FledastyBinarySearchTree_##name *current_binary_search_tree, key_type key) { \ + if (current_binary_search_tree == NULL) { \ + return false; \ + } \ + \ + FledastyBinarySearchTreeNode_##name *current_node = current_binary_search_tree->top; \ + while (current_node != NULL) { \ + if (compare_key_function(current_node->key, key)) { \ + return true; \ + } \ + \ + if (key_less_than_function(key, current_node->key)) { \ + current_node = current_node->left; \ + } else { \ + current_node = current_node->right; \ + } \ + } \ + \ + return false; \ } #endif diff --git a/Tests/Main.c b/Tests/Main.c index afe33b6..a1f9cd1 100644 --- a/Tests/Main.c +++ b/Tests/Main.c @@ -351,6 +351,10 @@ int main() { fledasty_binary_search_tree_int_int_get(&test_search_tree, 7, &get_out); printf("Search tree get result: %d\n", get_out); + if (fledasty_binary_search_tree_int_int_has_key(&test_search_tree, 10)) { + printf("Search tree has key: 10\n"); + } + fledasty_binary_search_tree_int_int_free(&test_search_tree); printf("Done\n"); return 0;