我有一个创建AVL树的C代码。我已经对所有函数进行了编码,以创建一棵树,但是我停留在删除树的最后一步。该功能根本不起作用。这是我的tree_free
函数;
void tree_free(TREE tree){
if (tree != NULL){
tree_free(tree->root->right);
free(tree->root->data);
tree_free(tree->root->left);
free(tree);
}
}
因此,对于那些想了解插入功能和结构的人,我将在下面分享这些功能的代码。
这是我在树上插入数字的方式;
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);
return node;
}else if( data > node->data){
node->right = avl_insert_recursive(node->right, data);
return node;
}else{
return node;
}
node->height = 1 + max(local_height(node->left), local_height(node->right));
return node;
}
最后,我想与您分享为 TREE 和 NODE 数据类型创建的结构。
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];
那么您能诊断出问题吗?感谢您的帮助。
答案 0 :(得分:0)
在tree_free()
函数中,您有:free(tree->root->data);
。但是tree->root->data
不是指向您先前分配的内存的指针。您的编译器应该已经对此发出警告。
此外,您的avl_insert_recursive()
函数似乎有问题。有一个永远不会到达的代码路径:height
永远不会由于if else块而更新。另外,node->data
永远不会被设置。
我还建议更改avl_insert_recursive()
签名。它应该接受指向根节点的指针,然后分配并插入节点本身,而不是接受指向节点已分配内存的指针。这样,您可以从free(tree->root->data);
中删除tree_free()
。