/** * Destroy the subtree with postorder traverse. */ _avlnode_t* _avl_tree_destroy_subtree(_avl_tree_t* pt_avl_tree, _avlnode_t* pt_root) { bool_t b_result = false; assert(pt_avl_tree != NULL); assert(_avl_tree_is_inited(pt_avl_tree) || _avl_tree_is_created(pt_avl_tree)); if (pt_root != NULL) { pt_root->_pt_left = _avl_tree_destroy_subtree(pt_avl_tree, pt_root->_pt_left); pt_root->_pt_right = _avl_tree_destroy_subtree(pt_avl_tree, pt_root->_pt_right); assert(pt_root->_pt_left == NULL && pt_root->_pt_right == NULL); b_result = _GET_AVL_TREE_TYPE_SIZE(pt_avl_tree); _GET_AVL_TREE_TYPE_DESTROY_FUNCTION(pt_avl_tree)(pt_root->_pby_data, &b_result); assert(b_result); _alloc_deallocate(&pt_avl_tree->_t_allocator, pt_root,_AVL_TREE_NODE_SIZE(_GET_AVL_TREE_TYPE_SIZE(pt_avl_tree)), 1); } return NULL; }
/** * Erases all the elements of a avl tree. */ void _avl_tree_clear(_avl_tree_t* pt_avl_tree) { assert(pt_avl_tree != NULL); assert(_avl_tree_is_inited(pt_avl_tree)); /* destroy all elements */ pt_avl_tree->_t_avlroot._pt_parent = _avl_tree_destroy_subtree(pt_avl_tree, pt_avl_tree->_t_avlroot._pt_parent); assert(pt_avl_tree->_t_avlroot._pt_parent == NULL); pt_avl_tree->_t_avlroot._pt_left = &pt_avl_tree->_t_avlroot; pt_avl_tree->_t_avlroot._pt_right = &pt_avl_tree->_t_avlroot; pt_avl_tree->_t_nodecount = 0; }
/** * Destroy avl tree container auxiliary function. */ void _avl_tree_destroy_auxiliary(_avl_tree_t* pt_avl_tree) { assert(pt_avl_tree != NULL); assert(_avl_tree_is_inited(pt_avl_tree) || _avl_tree_is_created(pt_avl_tree)); /* destroy all elements */ pt_avl_tree->_t_avlroot._pt_parent = _avl_tree_destroy_subtree(pt_avl_tree, pt_avl_tree->_t_avlroot._pt_parent); assert(pt_avl_tree->_t_avlroot._pt_parent == NULL); pt_avl_tree->_t_avlroot._pt_left = &pt_avl_tree->_t_avlroot; pt_avl_tree->_t_avlroot._pt_right = &pt_avl_tree->_t_avlroot; /* destroy allocator */ _alloc_destroy(&pt_avl_tree->_t_allocator); pt_avl_tree->_t_nodecount = 0; pt_avl_tree->_t_compare = NULL; }