c - 无法删除二叉搜索树
问题描述
我有一个创建 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];
那么你能诊断出问题吗?谢谢您的帮助。
解决方案
在你的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()
.
推荐阅读
- algorithm - 查找 XOR 和为零的数组数量
- google-bigquery - 特殊组成员时的 BigQuery 数据集访问
- mongodb - mongo db 没有在 centos 7 上启动
- python - 是否有计算项目产品价值的循环?
- ios - Vapor 3.1.10 Xcode-11.3.1 编译问题
- javascript - 禁用除 IE 之外的所有浏览器的 HTML5 AppCache
- c - 如何从一个数组中找到每个分支的百分比?在 C 中(已回答)
- zk - 如何在 zk-calendar 中将任何日/周/月设置为默认视图?
- python - 迁移错误“OperationalError at /admin/accounts/userstripe/ no such table:accounts_userstripe”
- g++ - cygwin中g ++的宏定义问题