10000 avltree_remove, avltree_free functions. · fragglet/c-algorithms@06f9f75 · GitHub
[go: up one dir, main page]

Skip to content

Commit 06f9f75

Browse files
committed
avltree_remove, avltree_free functions.
1 parent adc9bf6 commit 06f9f75

File tree

Collapse file tree

2 files changed

+71
-8
lines changed

2 files changed

+71
-8
lines changed

src/avltree.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ AVLTree *avltree_new(AVLTreeCompareFunc compare_func)
6464
return new_tree;
6565
}
6666

67+
static void avltree_free_subtree(AVLTree *tree, AVLTreeNode *node)
68+
{
69+
if (node == NULL) {
70+
return;
71+
}
72+
73+
avltree_free_subtree(tree, node->left_child);
74+
avltree_free_subtree(tree, node->right_child);
75+
76+
free(node);
77+
}
78+
79+
void avltree_free(AVLTree *tree)
80+
{
81+
/* Destroy all nodes */
82+
83+
avltree_free_subtree(tree, tree->root_node);
84+
85+
/* Free back the main tree data structure */
86+
87+
free(tree);
88+
}
89+
6790
int avltree_subtree_height(AVLTreeNode *node)
6891
{
6992
if (node == NULL) {
@@ -508,6 +531,29 @@ void avltree_remove_node(AVLTree *tree, AVLTreeNode *node)
508531
}
509532
}
510533

534+
/* Remove a node by key */
535+
536+
int avltree_remove(AVLTree *tree, void *key)
537+
{
538+
AVLTreeNode *node;
539+
540+
/* Find the node to remove */
541+
542+
node = avltree_lookup_node(tree, key);
543+
544+
if (node == NULL) {
545+
/* Not found in tree */
546+
547+
return 0;
548+
}
549+
550+
/* Remove the node */
551+
552+
avltree_remove_node(tree, node);
553+
554+
return 1;
555+
}
556+
511557
AVLTreeNode *avltree_lookup_node(AVLTree *tree, void *key)
512558
{
513559
AVLTreeNode *node;

src/avltree.h

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ POSSIBILITY OF SUCH DAMAGE.
4949
* as a mapping (searching for a value based on its key), or
5050
* as a set of keys which is always ordered.
5151
*
52-
* To create a new AVL tree, use @ref avltree_new.
52+
* To create a new AVL tree, use @ref avltree_new. To destroy
53+
* an AVL tree, use @ref avltree_free.
5354
*
5455
* To insert a new key-value pair into an AVL tree, use
55-
* @ref avltree_insert.
56+
* @ref avltree_insert. To remove an entry from an
57+
* AVL tree, use @ref avltree_remove or @ref avltree_remove_node.
5658
*
5759
* To search an AVL tree, use @ref avltree_lookup or
5860
* @ref avltree_lookup_node.
@@ -114,6 +116,14 @@ typedef int (*AVLTreeCompareFunc)(void *data1, void *data2);
114116

115117
AVLTree *avltree_new(AVLTreeCompareFunc compare_func);
116118

119+
/**
120+
* Destroy an AVL tree.
121+
*
122+
* @param tree The tree to destroy.
123+
*/
124+
125+
void avltree_free(AVLTree *tree);
126+
117127
/**
118128
* Insert a new key-value pair into an AVL tree.
119129
*
@@ -135,6 +145,19 @@ AVLTreeNode *avltree_insert(AVLTree *tree, void *key, void *value);
135145

136146
void avltree_remove_node(AVLTree *tree, AVLTreeNode *node);
137147

148+
/**
149+
* Remove an entry from a tree, specifying the key of the node to
150+
* remove.
151+
*
152+
* @param tree The tree.
153+
* @param key The key of the node to remove.
154+
* @return Zero (false) if no node with the specified key was
155+
* found in the tree, non-zero (true) if a node with
156+
* the specified key was removed.
157+
*/
158+
159+
int avltree_remove(AVLTree *tree, void *key);
160+
138161
/**
139162
* Search an AVL tree for a node with a particular key. This uses
140163
* the tree as a mapping.
@@ -228,12 +251,6 @@ AVLTreeNode *avltree_node_parent(AVLTreeNode *node);
228251

229252
int avltree_subtree_height(AVLTreeNode *node);
230253

231-
232-
/******************** debug for removal ******************************/
233-
234-
void avltree_print_tree(AVLTree *tree);
235-
int avltree_check_balanced(AVLTree *tree);
236-
237254
#ifdef __cplusplus
238255
}
239256
#endif

0 commit comments

Comments
 (0)
0