好的,这是周围CS人士在理论领域中的又一个问题。
在90年代,我在实施BST方面做得相当不错。我唯一无法克服的是平衡二叉树(AVL)的算法的复杂性。
你们可以帮我吗?
替罪羊树可能具有最简单的平衡确定算法来理解。如果有任何插入导致新节点过深,它会通过查看体重平衡而不是身高平衡来找到要重新平衡的节点。是否在删除时重新平衡的规则也很简单。它在节点中不存储任何奥秘信息。证明它是正确的比较棘手,但是您不需要了解它就可以了……
但是,与AVL不同,它并非始终保持高度平衡。像红黑色一样,它的不平衡是有界的,但是与红黑色不同,它的参数是可调的,因此,在大多数实际应用中,它看起来像您需要的那样是平衡的。我怀疑如果调得太紧,它在最坏情况下的插入效果会比AVL差或差。
回答问题
我将提供我的个人途径来理解AVL树。
首先,您必须了解什么是树旋转,因此,请忽略您曾经听过的AVL算法的所有其他内容,并加以理解。直截了当,这是向右旋转,是向左旋转,每个操作对树的作用,否则对精确方法的描述将使您感到困惑。
接下来,了解平衡AVL树的技巧是,每个节点都在其中记录其左子树和右子树的高度之间的差异。“平衡的高度”的定义是,对于树中的每个节点,它在-1和1之间(包括-1)。
接下来,了解如果您添加或删除了一个节点,则可能使树不平衡。但是,您只能更改作为添加或删除节点的祖先的节点的余额。因此,您要做的是用自己的方式备份树,使用旋转来平衡找到的所有不平衡节点,并更新其平衡分数,直到树再次平衡为止。
理解的最后一部分是在体面的参考中查找用于重新平衡找到的每个节点的特定旋转:这是它的“技术”,而不是高级概念。您只需要在修改AVL树代码时或在进行数据结构检查时记住细节即可。自从我上次在调试器中打开AVL树代码以来已经有很多年了- 实现趋向于达到它们可以工作然后保持工作的地步。所以我真的不记得了。您可以使用一些扑克筹码在桌子上进行排序,但是很难确定您确实拥有所有情况(数量不多)。最好只是查找一下。
然后就是将所有内容转换为代码的业务。
我认为查看代码清单对除最后一个阶段以外的任何阶段都没有太大帮助,因此请忽略它们。即使在最好的情况下,只要代码清楚地编写,它看起来就像是对过程的教科书描述,但是没有图表。在更典型的情况下,这是一堆C结构操作。因此,请坚持下去。