static void avltree_node_delete(AVLNode *node) { if (node!=NULL) { avltree_node_delete(node->right); avltree_node_delete(node->left); avltree_node_free(node); } return; }
static avltree_node_t * _avltree_remove(avltree_node_t *root, avltree_key_t key) { if (root == NULL) return NULL; if (key == root->key) { if (root->left && root->right) { root->right = _avltree_remove_min(root->right, root); } else { avltree_node_t *child; if (root->left) child = root->left; else child = root->right; avltree_node_delete(root); return child; } } else if (key < root->key) { root->left = _avltree_remove(root->left, key); } else { root->right = _avltree_remove(root->right, key); } return _avltree_fixup(root); }
static void _avltree_delete(avltree_node_t *node) { if (node) { _avltree_delete(node->left); _avltree_delete(node->right); avltree_node_delete(node); } }
static avltree_node_t * _avltree_remove_min(avltree_node_t *root, avltree_node_t *node) { if (root->left) { root->left = _avltree_remove_min(root->left, node); return _avltree_fixup(root); } else { node->key = root->key; node = root->right; avltree_node_delete(root); return node; } }
GAULFUNC void avltree_delete(AVLTree *tree) { if (!tree) return; avltree_node_delete(tree->root); s_free(tree); AVLnum_trees--; THREAD_LOCK(avltree_node_buffer_lock); if (AVLnum_trees == 0) _destroy_buffers(); THREAD_UNLOCK(avltree_node_buffer_lock); return; }
GAULFUNC void avltree_destroy(AVLTree *tree, AVLDestructorFunc free_func) { if (!tree) return; if (free_func!=NULL) avltree_node_destroy(tree->root, free_func); else avltree_node_delete(tree->root); s_free(tree); AVLnum_trees--; THREAD_LOCK(avltree_node_buffer_lock); if (AVLnum_trees == 0) _destroy_buffers(); THREAD_UNLOCK(avltree_node_buffer_lock); return; }