4 #include "utils_avltree.h"
6 #define BALANCE(n) ((((n)->right == NULL) ? 0 : (n)->right->height) \
7 - (((n)->left == NULL) ? 0 : (n)->left->height))
18 struct avl_node_s *left;
19 struct avl_node_s *right;
20 struct avl_node_s *parent;
22 typedef struct avl_node_s avl_node_t;
27 int (*compare) (const void *, const void *);
39 static void free_node (avl_node_t *n)
52 static avl_node_t *search (avl_tree_t *t, void *key)
60 cmp = t->compare (key, n->key);
72 static void rebalance (avl_tree_t *t, avl_node_t *n)
81 height_left = (n->left == NULL) ? 0 : n->left->height;
82 height_right = (n->right == NULL) ? 0 : n->right->height;
84 height_new = 1 + ((height_left > height_right) ? height_left : height_right);
86 if (height_new == n->height)
89 cmp = height_right - height_left;
99 l->parent = n->parent;
115 r->parent = n->parent;
126 } /* while (n != NULL) */
127 } /* void rebalance */
129 static avl_iterator_t *avl_create_iterator (avl_tree_t *t, avl_node_t *n)
131 avl_iterator_t *iter;
133 iter = (avl_iterator_t *) malloc (sizeof (avl_iterator_t));
143 void *avl_node_next (avl_tree_t *t, avl_node_t *n)
145 avl_node_t *r; /* return node */
151 else if (n->right == NULL)
157 /* stop if a bigger node is found */
158 if (t->compare (n, r) < 0) /* n < r */
166 while (r->left != NULL)
173 void *avl_node_prev (avl_tree_t *t, avl_node_t *n)
175 avl_node_t *r; /* return node */
181 else if (n->left == NULL)
187 /* stop if a smaller node is found */
188 if (t->compare (n, r) > 0) /* n > r */
196 while (r->right != NULL)
203 static void *remove (avl_tree_t *t, avl_node_t *n)
207 assert ((t != NULL) && (n != NULL));
211 if ((n->left == NULL) && (n->right == NULL))
213 /* Deleting a leave is easy */
214 if (n->parent == NULL)
216 assert (t->root == n);
221 assert ((n->parent->left == n)
222 || (n->parent->right == n));
223 if (n->parent->left == n)
224 n->parent->left = NULL;
226 n->parent->right = NULL;
233 avl_node_t *r; /* replacement node */
236 assert (n->left != NULL);
237 r = avl_node_prev (t, n);
241 assert (n->right != NULL);
242 r = avl_node_next (t, n);
256 avl_tree_t *avl_create (int (*compare) (const void *, const void *))
260 if ((t = (avl_tree_t *) malloc (sizeof (avl_tree_t))) == NULL)
264 t->compare = compare;
269 void avl_destroy (avl_tree_t *t)
275 int avl_insert (avl_tree_t *t, void *key, void *value)
281 if ((new = (avl_node_t *) malloc (sizeof (avl_node_t))) == NULL)
300 cmp = t->compare (nptr->key, new->key);
309 if (nptr->right == NULL)
321 else /* if (cmp > 0) */
324 if (nptr->left == NULL)
338 rebalance (t, new->parent);
341 } /* int avl_insert */
343 void *avl_remove (avl_tree_t *t, void *key)
353 return (remove (t, n));
354 } /* void *avl_remove */
356 void *avl_get (avl_tree_t *t, void *key)
367 avl_iterator_t *avl_get_iterator (avl_tree_t *t)
374 for (n = t->root; n != NULL; n = n->left)
378 return (avl_create_iterator (t, n));
379 } /* avl_iterator_t *avl_get_iterator */
381 void *avl_iterator_next (avl_iterator_t *iter)
385 if ((iter == NULL) || (iter->node == NULL))
388 n = avl_node_next (iter->tree, iter->node);
398 void *avl_iterator_prev (avl_iterator_t *iter)
402 if ((iter == NULL) || (iter->node == NULL))
405 n = avl_node_prev (iter->tree, iter->node);
415 void avl_iterator_destroy (avl_iterator_t *iter)