相信维基百科文章:http://en.wikipedia.org/wiki/AVL_tree
AVL树是高度平衡的,但通常不是重量平衡的,也不是μ平衡的; [4]也就是说,兄弟节点可以有很多不同数量的后代。
但是,因为AVL树是:
自平衡二进制搜索树[...]。在AVL树中,任何节点的两个子子树的高度相差至多一个
我不知道AVL是如何重量不平衡的,因为 - 如果我理解AVL树的定义 - 每个兄弟都会有大约相同数量的孩子,因为它们具有相同的高度+/- 1 。
那么,你能给我一个不平衡的AVL树的例子吗?我没有成功找到一个。因此,或者我误解了AVL /未加权树的定义,或维基百科文章是假的......
由于
答案 0 :(得分:5)
兄弟节点可能有很多不同的后代。
我只是对这个问题感到头疼,事实上我的AVL实现产生的树木最终并不是不平衡的,但其里面有越来越大的“远亲”子树。
我勾勒出这一点来安抚自己:
红色节点的余额为1,绿色为-1,黑色为0.这是一个有效的AVL树,因为两个兄弟子树之间的高度差不会超过一个,但有(几乎)右子树中的节点数是左子节点的两倍。
答案 1 :(得分:4)
您的理解是正确的,AVL树是由其边缘节点的几乎均匀的高度定义的,但您的混淆似乎与节点位置和边缘权重之间的差异有关。
即:在AVL树中,边缘节点的深度将相同+/-(但不是两个!)。这并未声明与节点之间的边缘相关联的成本。对于具有根节点和两个子节点的AVL树,左路径的路径可能是右路径的两倍。这会使树的权重不平衡,但仍然保持AVL树的定义。
此页面包含更多信息:Weight-balanced tree - wikipedia
来自维基百科:
二进制树称为μ-balanced,带,如果对于每个节点N,则为不等式:
使用此属性,保持且μ最小。 | N |是树下的节点数,N为根(包括根),Nl是N的左子树。
基本上,这意味着AVL树中的子项不一定均匀分布在树的最低层。将N表示为树的根节点,可以构造一个有效的AVL树,其在根的左侧比在其右侧具有更多的子节点。对于非常深的树,在这个底层可能有很多节点。
AVL树的定义要求它们都在最深处之一,但不能保证它们是哪个节点相对于节点N.