【问题标题】:Can't remove a binary search tree无法删除二叉搜索树
【发布时间】:2018-12-01 22:50:09
【问题描述】:

我有一个创建 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;

}

最后,我想与您分享我为 TREENODE 数据类型创建的结构。

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()函数开始工作时程序结束。

标签: c sorting data-structures binary-search-tree


【解决方案1】:

在你的tree_free() 函数中,你有这个:free(tree-&gt;root-&gt;data);。但是tree-&gt;root-&gt;data 不是指向您之前分配的内存的指针。你的编译器应该已经警告过你了。

此外,您的avl_insert_recursive() 函数似乎有误。有一条永远无法到达的代码路径:height 永远不会因为 if else 块而被更新。此外,node-&gt;data 永远不会被设置。

我还建议更改avl_insert_recursive() 签名。它不应接受指向已为节点分配的内存的指针,而应接受指向根节点的指针,并分配和插入节点本身。这样,您可以从tree_free() 中删除free(tree-&gt;root-&gt;data);

【讨论】:

  • 那我应该怎么改行free(tree-&gt;root-&gt;data);?我究竟应该释放什么?
  • 我会有一个名为 node_free() 的函数,它会这样做:void node_free(NODE node) { node_free(node-&gt;left); node_free(node-&gt;right); free(node); },我会从 tree_free() 调用它,例如:node_free(tree-&gt;root);
  • 但是节点必须分配在avl_insert_recursive。希望这能让你走上正确的道路。
  • 从 else 块中移除 return 并在其中分配节点。
  • 好吧,我仍然无法解决关于tree_free() 的问题。我像你说的那样创建了函数node_free(),然后从tree_free() 调用它,但它仍然不起作用。 void node_free(NODE node){ node_free(node-&gt;left); node_free(node-&gt;right); free(node); } 和另一个函数是这样的void tree_free(TREE tree){ node_free(tree-&gt;root); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2013-11-21
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多