无法删除二叉搜索树

时间:2018-12-01 22:50:09

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

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

那么您能诊断出问题吗?感谢您的帮助。

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()