Пример #1
0
static void avl_free_node(avl_node_t *root)
{
	if(root == NULL)
		return;

	avl_free_node(root->left_child);
	avl_free_node(root->right_child);
	bs_free(root);
}
Пример #2
0
void bs_avl_deinit(bs_avl_t* avl)
{
	avl_node_t* node;
	if(NULL == avl->root)
	{
		return ;
	}

	avl_free_node((avl_node_t*)avl->root);
}
Пример #3
0
/* delete an node from tree */
static avl_node_t* avl_remove_node(avl_node_t* root, avl_key_t key)
{
    int factor = 0;
    int rotate = 0;
    if (root == NULL)
        return NULL;
    if (key < root->key)
    {
        root->left = avl_remove_node(root->left, key);
    }
    else if (key > root->key)
    {
        root->right = avl_remove_node(root->right, key);
    }
    else   /* this is the node to be deleted */
    {
        if ((root->left == NULL) || (root->right == NULL))
        {
            avl_node_t* node = (root->left ? root->left : root->right);
            if (node != NULL)  /* one child case */
            {
                *root = *node;
            }
            else  /* no child case */
            {
                node = root;
                root = NULL;
            }
            avl_free_node(node);
        }
        else  /* node with two children */
        {
            avl_node_t* node = avl_node_min(root->right);
            root->key = node->key;
            root->data = node->data;
            root->right = avl_remove_node(root->right, node->key);
        }
    }

    if (root == NULL)
        return NULL;
    root->height = MAX(HEIGHT(root->left), HEIGHT(root->right)) + 1;
    factor = avl_get_balance(root);
    if (factor > 1)
    {
        int left_balance = avl_get_balance(root->left);
        rotate = (left_balance >= 0 ? ROT_LEFT : ROT_RIGHT);
    }
    else if (factor < -1)
    {
        int right_balance = avl_get_balance(root->right);
        rotate = (right_balance <= 0 ? ROT_RIGHT : ROT_LEFT);
    }
    return avl_balance_node(root, factor, rotate);
}
Пример #4
0
void
avl_free(avl_tree_t *root){

	if(root == NULL){
		return;
	}
	avl_free(root->left);
	avl_free(root->right);
	avl_free_node(root);

}
Пример #5
0
/* destroy all nodes */
static int avl_destroy_node(avl_node_t* root)
{
    if (root->left != NULL)
        return avl_destroy_node(root->left) + 1;
    else if (root->right != NULL)
        return avl_destroy_node(root->right) + 1;
    else
    {
        avl_free_node(root);
        return 1;
    }
}