我有一个用于AVL树的C程序。我已经对创建节点,创建树,将元素插入树等所有必需的功能进行了编码。一切正常,但我无法设法使用char const* str[10] = { YES, NO, YES, NO, /* ... */ };
函数。我希望此功能删除所有树。这是我的结构;
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];
这是avl_insert_recursive函数;
void avl_insert(TREE tree, unsigned long long data){
tree->root = avl_insert_recursive(tree->root, data);
}
如您所见,数字首先插入一个节点。然后将该节点插入树中。这就是为什么我有2个功能可以删除这三个功能。第一个功能就是简单地删除节点;
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);
}
tree_free`函数之后放置了printf
语句。感谢您的帮助。
编辑:对于那些想了解tree_free', and it is never executed. So, the program is crashing when it comes the line with
功能的人,您在这里;
node_init
我有一个测试功能来测试我的AVL树;
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;
}
这是我的主要功能;
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;
}
答案 0 :(得分:3)
假设return <p>...</p>
是全局变量。
问题是您没有重置全局index
。
index
第一次调用inorder[index] = node->data;
index++;
后,您的索引将为test
。
因此您可以访问
10000
因此,每次调用inorder[10000+100000] in the second `test` call.
后,都要重置索引。
test