我正在使用tsearch()创建二进制文件。树是否自动平衡。如何验证树是平衡的还是不平衡的。
答案 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()
的定义不需要任何平衡,所以不幸的是你不能假设这些函数表现良好。我在查看一些现有实现时观察到的内容:
tdelete()
使树不平衡的错误。答案 2 :(得分:0)
Paddy的回答解释了如何验证树是否平衡,但没有回答树是否平衡的问题。
我做了Paddy的建议,对我的回答是是,它是平衡的(我在Fedora上运行GCC 5.1.1,Glibc 2.21)
(我不确定这是否也适用于操作系统,编译器和标准库的不同组合。如果有人在他们的系统上尝试不同的答案,请在此处添加答案!)