树是由tsearch()平衡树创建的吗?

时间:2013-11-11 22:18:46

标签: c binary-tree

我正在使用tsearch()创建二进制文件。树是否自动平衡。如何验证树是平衡的还是不平衡的。

3 个答案:

答案 0 :(得分:2)

您可以通过在有序的值列表上调用tsearch进行验证,然后调用twalk,提供打印出树深度的操作。如果没有进行树排序,则有序插入将创建一个列表而不是树,您将输出升序深度值。

void print_depth( const void *nodep, const VISIT which, const int depth )
{
    if( which == preorder || which == leaf ) printf( "%d\n", depth );
}

twalk( root, print_depth );

答案 1 :(得分:2)

我在my own implementation of tsearch()工作的时候看过这个问题。对于此API,使用AVL树比使用红黑树更有意义,因为通过回调函数执行比较具有相当高的开销。 AVL树更加均衡,这意味着回调的调用频率较低。

似乎POSIX中tsearch()的定义不需要任何平衡,所以不幸的是你不能假设这些函数表现良好。我在查看一些现有实现时观察到的内容:

  • glibc将其实现为红黑树。
  • musl将其实现为AVL树,但在2015-12-08之前它包含一个导致tdelete()使树不平衡的错误。
  • Solaris和BSD似乎都共享相同的实现,根本不使用任何平衡。
  • FreeBSD 11.0将不再使用不平衡的实现,因为它现在使用我编写的实现。 FreeBSD 11.0应该会在今年晚些时候发布。

答案 2 :(得分:0)

Paddy的回答解释了如何验证树是否平衡,但没有回答树是否平衡的问题。

我做了Paddy的建议,对我的回答是是,它是平衡的(我在Fedora上运行GCC 5.1.1,Glibc 2.21)

(我不确定这是否也适用于操作系统,编译器和标准库的不同组合。如果有人在他们的系统上尝试不同的答案,请在此处添加答案!)