У меня есть программа на 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);
}