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); }
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); }
/* 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); }
void avl_free(avl_tree_t *root){ if(root == NULL){ return; } avl_free(root->left); avl_free(root->right); avl_free_node(root); }
/* 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; } }