相信维基百科文章:http://en.wikipedia.org/wiki/AVL_tree
AVL树高度平衡,但一般不平衡重量,也不平衡μ;[4] 也就是说,同级节点的子节点数量可能相差很大。
但是,作为AVL树是:
自平衡二叉查找树[...]。在AVL树中,任何节点的两个子树的高度最多相差一个
我不明白AVL怎么会是重量不平衡的,因为——如果我很好地理解AVL树的定义——每个兄弟姐妹都会有大约相同数量的孩子,因为他们有相同的身高 /-1。
那么,你能给我一个AVL树的例子,它是不平衡的吗?我没有找到一个。因此,或者我误解了AVL/未加权树的定义,或者维基百科的文章是错误的。。。
谢啦
兄弟节点可以有非常不同数量的后代。
我只是在挠头,我的AVL实现生成的树并不是最终不平衡的,而是内部有越来越大的“远亲”子树。
我勾勒出这个来安慰自己:
红色节点的余额为1,绿色节点为-1,黑色节点为0。这是一个有效的AVL树,因为两个兄弟子树之间的高度差异永远不会超过一个,但右子树中的节点数量(几乎)是左子树的两倍。
您的理解是正确的,AVL树是由其边缘节点的几乎均匀的高度定义的,但您的困惑似乎是关于节点位置和边缘权重之间的差异。
也就是说:在AVL树中,边缘节点的深度将与 /-相同(但不是两者!)。这不会对节点之间的边缘相关的成本提出索赔。对于具有根节点和两个子节点的AVL树,左路径的遍历成本可能是右路径的两倍。这将使树权重不平衡,但仍保持AVL树的定义。
此页面有更多信息:权重平衡树-维基百科
来自维基百科:
|N|是以N为根(包括根)的树下的节点数,Nl是N的左子树。
本质上,这意味着AVL树中的子级不一定均匀分布在树的最低级别。以N表示树的根节点,可以构造一个有效的AVL树,该树在根的左侧比右侧有更多的子级。对于非常深的树,此底层可能有许多节点。
AVL树的定义要求它们都位于最深点之一内,但不能保证它们相对于节点N是哪个节点的子节点。
排序二叉树中存在一个问题就是可能会退化成一个链表,当只有左子树或者右子树有节点的时候,此时排序二叉树就像链表一样,但因为排序二叉树在插入查询的时候还要判断左右子树的问题,这样查询的效率反而变低,从而引出了平衡二叉树 平衡二叉树又称平衡搜索树(Self-balance Binary Search Tree)又称AVL树,同时保证了查询和添加的效率。首先平衡二叉树是一颗排序二叉树,且它是空树或者他的每
主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为 AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。 图 1 平衡与不平衡的二叉树及结点的
如果在AVL树中插入一个节点,则可能会发生new_node路径中的一个节点将失去高度平衡的情况。但是我的问题是,如果这个节点是固定的,那么它上面的其他节点(祖先直到根)是否仍然会保持高度不平衡(以防他们之前失去平衡)。 我做了一些书面工作,可以观察到这种情况是不可能的。一旦高度不平衡被固定在一个节点上,它的所有祖先都应该被自动固定(如果它们受到影响)。
在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的
现在我们已经证明保持 AVL树的平衡将是一个很大的性能改进,让我们看看如何增加过程来插入一个新的键到树。由于所有新的键作为叶节点插入到树中,并且我们知道新叶的平衡因子为零,所以刚刚插入的节点没有新的要求。但一旦添加新叶,我们必须更新其父的平衡因子。这个新叶如何影响父的平衡因子取决于叶节点是左孩子还是右孩子。如果新节点是右子节点,则父节点的平衡因子将减少1。如果新节点是左子节点,则父节点的平衡因子将
本文向大家介绍在Javascript AVL树中计算平衡因子,包括了在Javascript AVL树中计算平衡因子的使用技巧和注意事项,需要的朋友参考一下 AVL树检查左子树和右子树的高度,并确保差异不超过1。该差异称为“平衡因子”。 例如,在以下树中,第一棵树是平衡的,接下来的两棵树是不平衡的- 在第二棵树中,C的左子树的高度为2,而右边子树的高度为0,所以差为2。在第三棵树中,A的右子树的高度