我正在使用tsearch()创建二叉树。这个树会自动平衡吗?如何确定这个树是平衡的还是不平衡的。
我正在使用tsearch()创建二叉树。这个树会自动平衡吗?如何确定这个树是平衡的还是不平衡的。
我曾在制作 自己的tsearch()
实现 时研究过这个问题。对于这个API,使用AVL树比使用红黑树更有意义,因为通过回调函数进行比较具有相当高的开销。AVL树更平衡,这意味着回调函数被调用的频率较低。
看起来POSIX中tsearch()
的定义不需要任何平衡,所以很遗憾,您不能假设这些函数表现良好。我在查看一些现有实现时观察到的情况:
tdelete()
使树失去平衡。posix_tnode *
而不是POSIX所规定的void *
。 - Chris Doddvoid **
为posix_tnode **
)。 - Chris Doddtsearch
,然后调用twalk
来验证,提供一个打印树深度的action。如果没有进行树排序,则有序插入将创建一个列表而不是一棵树,您将输出升序深度值。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 );
Paddy的回答解释了如何验证树是否平衡,但并没有回答树是否平衡的问题。
我按照Paddy的建议做了,对我来说答案是是的,它是平衡的(我在Fedora上运行GCC 5.1.1,Glibc 2.21)
(我不确定这是否也适用于不同的操作系统、编译器和标准库组合。如果有人在他们的系统上尝试了不同的答案,请在这里添加一个答案!)