не удалось освободить рут в avltree - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в 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)

Кажется, он остается указателем на что-то. Но я не мог понять, что происходит.

Заранее спасибо !!

...