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, const 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 n->height = height_new;
91 cmp = height_right - height_left;
101 l->parent = n->parent;
108 if (l->parent == NULL)
110 assert (t->root == n);
115 assert ((l->parent->left == n) || (l->parent->right == n));
116 if (l->parent->left == n)
119 l->parent->right = l;
131 r->parent = n->parent;
138 if (r->parent == NULL)
140 assert (t->root == n);
145 assert ((r->parent->left == n) || (r->parent->right == n));
146 if (r->parent->left == n)
149 r->parent->right = r;
157 assert ((n == NULL) || (n->parent == NULL)
158 || (n->parent->left == n)
159 || (n->parent->right == n));
160 } /* while (n != NULL) */
161 } /* void rebalance */
163 static avl_iterator_t *avl_create_iterator (avl_tree_t *t, avl_node_t *n)
165 avl_iterator_t *iter;
167 iter = (avl_iterator_t *) malloc (sizeof (avl_iterator_t));
177 void *avl_node_next (avl_tree_t *t, avl_node_t *n)
179 avl_node_t *r; /* return node */
185 else if (n->right == NULL)
191 /* stop if a bigger node is found */
192 if (t->compare (n, r) < 0) /* n < r */
200 while (r->left != NULL)
207 void *avl_node_prev (avl_tree_t *t, avl_node_t *n)
209 avl_node_t *r; /* return node */
215 else if (n->left == NULL)
221 /* stop if a smaller node is found */
222 if (t->compare (n, r) > 0) /* n > r */
230 while (r->right != NULL)
237 static int _remove (avl_tree_t *t, avl_node_t *n)
239 assert ((t != NULL) && (n != NULL));
241 if ((n->left == NULL) && (n->right == NULL))
243 /* Deleting a leave is easy */
244 if (n->parent == NULL)
246 assert (t->root == n);
251 assert ((n->parent->left == n)
252 || (n->parent->right == n));
253 if (n->parent->left == n)
254 n->parent->left = NULL;
256 n->parent->right = NULL;
258 rebalance (t, n->parent);
265 avl_node_t *r; /* replacement node */
268 assert (n->left != NULL);
269 r = avl_node_prev (t, n);
273 assert (n->right != NULL);
274 r = avl_node_next (t, n);
283 } /* void *_remove */
288 avl_tree_t *avl_create (int (*compare) (const void *, const void *))
292 if ((t = (avl_tree_t *) malloc (sizeof (avl_tree_t))) == NULL)
296 t->compare = compare;
301 void avl_destroy (avl_tree_t *t)
307 int avl_insert (avl_tree_t *t, void *key, void *value)
313 if ((new = (avl_node_t *) malloc (sizeof (avl_node_t))) == NULL)
332 cmp = t->compare (nptr->key, new->key);
341 if (nptr->right == NULL)
353 else /* if (cmp > 0) */
356 if (nptr->left == NULL)
370 assert ((new->parent != NULL)
371 && ((new->parent->left == new)
372 || (new->parent->right == new)));
375 } /* int avl_insert */
377 int avl_remove (avl_tree_t *t, void *key, void **rkey, void **rvalue)
392 return (_remove (t, n));
393 } /* void *avl_remove */
395 int avl_get (avl_tree_t *t, const void *key, void **value)
399 assert (value != NULL);
410 avl_iterator_t *avl_get_iterator (avl_tree_t *t)
417 for (n = t->root; n != NULL; n = n->left)
421 return (avl_create_iterator (t, n));
422 } /* avl_iterator_t *avl_get_iterator */
424 void *avl_iterator_next (avl_iterator_t *iter)
428 if ((iter == NULL) || (iter->node == NULL))
431 n = avl_node_next (iter->tree, iter->node);
441 void *avl_iterator_prev (avl_iterator_t *iter)
445 if ((iter == NULL) || (iter->node == NULL))
448 n = avl_node_prev (iter->tree, iter->node);
458 void avl_iterator_destroy (avl_iterator_t *iter)