定义与概念
- 重量平衡树是一种自平衡二叉搜索树。与其他自平衡二叉搜索树(如 AVL 树、红黑树)类似,它的主要目的是在动态插入和删除节点的过程中,保持树的高度相对平衡,从而确保基本操作(搜索、插入、删除)都能在对数时间复杂度内完成。
- 重量平衡树的平衡条件是基于子树的 “重量” 来定义的。这里的重量通常指的是子树中节点的数量。对于树中的每个节点,其左子树和右子树的重量满足一定的比例关系,以此来保证树的平衡。
主要操作
- 插入操作:插入一个新节点时,从根节点开始,根据节点值的大小与当前节点比较,决定向左子树还是右子树插入。插入后,需要更新相关节点的重量,并检查是否违反了重量平衡条件。如果违反了,需要通过旋转操作来调整树的结构,以恢复平衡。
- 删除操作:删除节点时,先找到要删除的节点,然后根据节点的情况进行删除。如果删除后导致树不平衡,同样需要通过旋转操作来恢复平衡。
- 搜索操作:从根节点开始,与要搜索的值进行比较。如果相等,则找到目标节点;如果当前节点值大于要搜索的值,则在左子树中继续搜索;否则在右子树中继续搜索。
平衡调整
- 计算平衡因子:对于每个节点,计算其左子树重量和右子树重量的差值或比例。如果这个差值或比例超出了规定的范围,就需要进行调整。
- 旋转操作:与 AVL 树类似,重量平衡树也通过左旋和右旋操作来调整树的结构。比如,当左子树过重时,可能需要进行右旋操作;当右子树过重时,可能需要进行左旋操作。
板子
应用场景
- 数据存储与检索:适用于需要高效存储和快速检索大量数据的场景,如数据库索引、字典等。
- 优先队列:可以用来实现优先队列,根据节点的某种优先级来维护队列的顺序,插入和删除操作都能保持较好的时间复杂度。
- 动态集合维护:在需要动态添加和删除元素的集合中,重量平衡树能够快速定位和操作元素,保证集合操作的高效性。