如何从POSIX二进制(tsearch)树中删除所有节点?

时间:2016-09-19 09:24:39

标签: c binary-tree

我看到访问所有节点(如果密钥未知)的唯一方法是twalk。允许在tdelete内使用twalk吗?如果不是 - 如何删除所有节点? (我不想使用非便携式GNU扩展tdestroy。)

1 个答案:

答案 0 :(得分:3)

不,您不需要使用twalk,您可以将tdelete与比较功能(用于插入的功能相同),tdelete更改根节点,所以传递和删除while (root != NULL)将会解决这个问题,例如:

typedef struct {
    int key;
    char value[50];
} t_data;

static int comp(const void *pa, const void *pb)
{
    const t_data *a = pa, *b = pb;

    if (a->key > b->key) return +1;
    if (a->key < b->key) return -1;
    return 0;
}

int main(void)
{
    void *root = NULL;
    t_data *data;    

    ...

    while (root != NULL) {
        data = *(t_data **)root;
        tdelete(data, &root, comp);
        free(data);
    }

    ...