如何从 POSIX 二叉(搜索)树中删除所有节点?
How to remove all nodes from a POSIX binary (tsearch) tree?
我看到访问所有节点(如果密钥未知)的唯一方法是 twalk
。 twalk
里面可以使用tdelete
吗?如果不是——如何删除所有节点? (我不想使用不可移植的 GNU 扩展 tdestroy
。)
不用,不需要用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);
}
...
我看到访问所有节点(如果密钥未知)的唯一方法是 twalk
。 twalk
里面可以使用tdelete
吗?如果不是——如何删除所有节点? (我不想使用不可移植的 GNU 扩展 tdestroy
。)
不用,不需要用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);
}
...