Я новичок в C и не могу четко понять указатель или некоторые другие вещи, поэтому я пытаюсь реализовать AVLTree в C, но у меня есть ошибка в моем коде. Некоторые из проблем могут быть глупыми, но я действительно запутался в таких вещах. Для этого я хочу освободить узел в дереве AVL. Но у меня так много проблем с указателем, свободным и еще чем-то. Я надеюсь, что вы будете терпеливы с моей ошибкой.
Вот моя древовидная структура AVL:
typedef struct AVLTreeNode {
int key;
int value;
int height;
struct AVLTreeNode *parent;
struct AVLTreeNode *left;
struct AVLTreeNode *right;
} AVLTreeNode;
typedef struct AVLTree{
int size; // count of items in avl tree
AVLTreeNode *root; // root
} AVLTree;
AVLTreeNode *newAVLTreeNode(int k, int v )
{
AVLTreeNode *new;
new = malloc(sizeof(AVLTreeNode));
assert(new != NULL);
new->key = k;
new->value = v;
new->height = 0; // height of this new node is set to 0
new->left = NULL; // this node has no child
new->right = NULL;
new->parent = NULL; // no parent
return new;
}
AVLTree *newAVLTree()
{
AVLTree *T;
T = malloc(sizeof (AVLTree));
assert (T != NULL);
T->size = 0;
T->root = NULL;
return T;
}
и моя бесплатная функция:
void destroy_avltree(AVLTreeNode *N)
{
if (N->left!=NULL) destroy_avltree(N->left);
if (N->right!=NULL) destroy_avltree(N->right);
if (N->parent && N->key < N->parent->key) N->parent->left = NULL;
if (N->parent && N->key > N->parent->key) N->parent->right = NULL;
free(N);
}
// put your time complexity analysis for freeAVLTree() here
void FreeAVLTree(AVLTree *T)
{
assert(T!=NULL);
destroy_avltree(T->root);
free(T);
}
Я мог бы освободить любой другой узел, кроме корня.
вот мой результат может выглядеть так:
Дерево предзаказа:
(7, 7) (3, 3) (1, 1) (0, 0) (2, 2) (5, 5) (4, 4) (6, 6) (11, 11) (9, 9) (8, 8) (10, 10) (13, 13) (12, 12) (14, 14)
после бесплатно:
(39674416, 0)
Кажется, он остается указателем на что-то. Но я не мог понять, что происходит.
Заранее спасибо !!