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)
92 cmp = BALANCE(n->left);
93 assert ((cmp >= -1) && (cmp <= 1));
97 cmp = BALANCE(n->right);
98 assert ((cmp >= -1) && (cmp <= 1));
101 n->height = height_new;
103 cmp = height_right - height_left;
113 l->parent = n->parent;
120 if (l->parent == NULL)
122 assert (t->root == n);
127 assert ((l->parent->left == n) || (l->parent->right == n));
128 if (l->parent->left == n)
131 l->parent->right = l;
134 height_left = (n->left == NULL) ? 0 : n->left->height;
135 height_right = (n->right == NULL) ? 0 : n->right->height;
136 height_new = 1 + ((height_left > height_right) ? height_left : height_right);
138 assert (height_new < n->height);
139 assert ((cmp >= -1) || (cmp <= 1));
140 n->height = height_new;
142 height_left = (l->left == NULL) ? 0 : l->left->height;
143 height_right = (l->right == NULL) ? 0 : l->right->height;
144 height_new = 1 + ((height_left > height_right) ? height_left : height_right);
146 assert (height_new >= l->height);
147 assert ((cmp >= -1) || (cmp <= 1));
148 l->height = height_new;
161 r->parent = n->parent;
168 if (r->parent == NULL)
170 assert (t->root == n);
175 assert ((r->parent->left == n) || (r->parent->right == n));
176 if (r->parent->left == n)
179 r->parent->right = r;
182 height_left = (n->left == NULL) ? 0 : n->left->height;
183 height_right = (n->right == NULL) ? 0 : n->right->height;
184 height_new = 1 + ((height_left > height_right) ? height_left : height_right);
186 assert (height_new < n->height);
187 assert ((cmp >= -1) || (cmp <= 1));
188 n->height = height_new;
190 height_left = (r->left == NULL) ? 0 : r->left->height;
191 height_right = (r->right == NULL) ? 0 : r->right->height;
192 height_new = 1 + ((height_left > height_right) ? height_left : height_right);
194 assert (height_new >= r->height);
195 assert ((cmp >= -1) || (cmp <= 1));
196 r->height = height_new;
205 assert ((n == NULL) || (n->parent == NULL)
206 || (n->parent->left == n)
207 || (n->parent->right == n));
208 } /* while (n != NULL) */
209 } /* void rebalance */
211 static avl_iterator_t *avl_create_iterator (avl_tree_t *t, avl_node_t *n)
213 avl_iterator_t *iter;
215 iter = (avl_iterator_t *) malloc (sizeof (avl_iterator_t));
225 void *avl_node_next (avl_tree_t *t, avl_node_t *n)
227 avl_node_t *r; /* return node */
233 else if (n->right == NULL)
239 /* stop if a bigger node is found */
240 if (t->compare (n, r) < 0) /* n < r */
248 while (r->left != NULL)
255 void *avl_node_prev (avl_tree_t *t, avl_node_t *n)
257 avl_node_t *r; /* return node */
263 else if (n->left == NULL)
269 /* stop if a smaller node is found */
270 if (t->compare (n, r) > 0) /* n > r */
278 while (r->right != NULL)
285 static int _remove (avl_tree_t *t, avl_node_t *n)
287 assert ((t != NULL) && (n != NULL));
289 if ((n->left == NULL) && (n->right == NULL))
291 /* Deleting a leave is easy */
292 if (n->parent == NULL)
294 assert (t->root == n);
299 assert ((n->parent->left == n)
300 || (n->parent->right == n));
301 if (n->parent->left == n)
302 n->parent->left = NULL;
304 n->parent->right = NULL;
306 rebalance (t, n->parent);
313 avl_node_t *r; /* replacement node */
316 assert (n->left != NULL);
317 r = avl_node_prev (t, n);
321 assert (n->right != NULL);
322 r = avl_node_next (t, n);
331 } /* void *_remove */
336 avl_tree_t *avl_create (int (*compare) (const void *, const void *))
340 if ((t = (avl_tree_t *) malloc (sizeof (avl_tree_t))) == NULL)
344 t->compare = compare;
349 void avl_destroy (avl_tree_t *t)
355 int avl_insert (avl_tree_t *t, void *key, void *value)
361 if ((new = (avl_node_t *) malloc (sizeof (avl_node_t))) == NULL)
380 cmp = t->compare (nptr->key, new->key);
389 if (nptr->right == NULL)
401 else /* if (cmp > 0) */
404 if (nptr->left == NULL)
418 assert ((new->parent != NULL)
419 && ((new->parent->left == new)
420 || (new->parent->right == new)));
423 } /* int avl_insert */
425 int avl_remove (avl_tree_t *t, void *key, void **rkey, void **rvalue)
440 return (_remove (t, n));
441 } /* void *avl_remove */
443 int avl_get (avl_tree_t *t, const void *key, void **value)
447 assert (value != NULL);
458 avl_iterator_t *avl_get_iterator (avl_tree_t *t)
465 for (n = t->root; n != NULL; n = n->left)
469 return (avl_create_iterator (t, n));
470 } /* avl_iterator_t *avl_get_iterator */
472 void *avl_iterator_next (avl_iterator_t *iter)
476 if ((iter == NULL) || (iter->node == NULL))
479 n = avl_node_next (iter->tree, iter->node);
489 void *avl_iterator_prev (avl_iterator_t *iter)
493 if ((iter == NULL) || (iter->node == NULL))
496 n = avl_node_prev (iter->tree, iter->node);
506 void avl_iterator_destroy (avl_iterator_t *iter)