Удаление всего бинарного дерева поиска в одной функции - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть программа на C для дерева AVL.Я закодировал все необходимые функции для создания узла, создания дерева, вставки элемента в дерево и так далее.Все работает нормально, но мне не удалось получить функцию tree_free, которая работает.Я хочу, чтобы эта функция удаляла все дерево.Вот мои структуры;

typedef struct NODE_s *NODE;
typedef struct NODE_s
{  
    NODE right;
    NODE left;
    unsigned long long data;
    int height;
} NODE_t[1];

typedef struct TREE_s *TREE;
typedef struct TREE_s
{
    NODE root;
} TREE_t[1];

Вот как я вставляю числа в мое дерево;

void avl_insert(TREE tree, unsigned long long data){


    tree->root = avl_insert_recursive(tree->root, data);

}

А вот функция avl_insert_recursive;

NODE avl_insert_recursive(NODE node, unsigned long long data){

    int balance = 0;


    if( node == NULL){

        return(node_init(data));
    }

    if( data < node->data ){


        node->left = avl_insert_recursive(node->left, data);



    }else if( data > node->data){


        node->right = avl_insert_recursive(node->right, data);



    }else{

        return node;
    }

    node->height = 1 + max(local_height(node->left), local_height(node->right));

    return node;
}

КакВы видите, номер вставляется в узел в первую очередь.Затем узел вставляется в дерево.Вот почему у меня есть две функции для удаления трех.Первая функция просто удаляет узлы;

void node_free(NODE node){

    if(node != NULL){

    node_free(node->left); 
    node_free(node->right); 
    free(node);

    }
}

И я вызываю эту функцию из основной tree_free функции;

void tree_free(TREE tree){

    node_free(tree->root);

}

Так что это все коды, которые вам нужны, чтобы понять, как работает деревоработает.Я поместил оператор printf после функции tree_free', and it is never executed. So, the program is crashing when it comes the line with tree_free`.Спасибо за помощь.

Редактировать: Для тех, кто хотел видеть функцию node_init, вот вам;

NODE node_init(unsigned long long data)
{

    NODE newNode = (struct NODE_s*)malloc(sizeof(struct NODE_s));
    newNode->data = data;
    newNode->right = NULL;
    newNode->left = NULL;
    newNode->height = 1; 
    return newNode;
}

У меня есть функция тестирования для проверки моего дерева AVL;

void test(char *fname, int n)
{

// Create tree and initalized it.
TREE tree;
tree = tree_init();


//NODE node = node_init(NULL);

time_t start, end;
int avl_insertion_time = 0;

FILE *fp;
int i = 0;
unsigned long long number;

unsigned long long *inorder = (unsigned long long *)malloc(sizeof(unsigned long long)*n);
fp = fopen(fname, "r+");
time(&start);
for(i = 0; i<n; i++){
    fscanf(fp, "%llu\n", &number);
    //node = avl_insert_recursive(node,number);
    avl_insert(tree, number);
}
time(&end);
fclose(fp);
avl_insertion_time = end - start

time(&start);
inorder_traversal(tree->root, inorder);
time(&end);
printf("inorder_traversal function's time spent is %ld second for %d number of elements.(AVL insertion was %ld secs)\n", (end - start), n, avl_insertion_time);
tree_free(tree);
free(inorder);
}

И вот моя основная функция;

int main()
{


test("10000.txt", 10000);
test("100000.txt", 100000);
test("1000000.txt", 1000000);
test("10000000.txt", 10000000);


return 0;
}

Вот функция, чтобы пройти мое дерево;

void inorder_traversal(NODE node, unsigned long long *inorder){


if (node == NULL){
    return; 
}


inorder_traversal(node->left, inorder); 



inorder[index] = node->data;
index++;



inorder_traversal(node->right, inorder); 


}

1 Ответ

0 голосов
/ 02 декабря 2018

Предполагается, что index является глобальной переменной.

Проблема в том, что вы не сбрасываете глобальные index.

inorder[index] = node->data;
index++;

После первого вызова test ваш индекс будетbe 10000.

Следовательно, вы получаете доступ к

inorder[10000+100000] in the second `test` call.

Таким образом, после каждого звонка сбросьте индекс на test.

int main()
{

index = 0;
test("10000.txt", 10000);
index = 0;
test("100000.txt", 100000);
index = 0;
test("1000000.txt", 1000000);
index = 0;
test("10000000.txt", 10000000);


return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...