在每个节点检查高度差
AVL树首先满足普通二叉搜索树的键顺序,并额外要求任意节点两侧子树高度差不超过一。平衡条件在整棵树上递归成立,因此不能只检查根节点左右看起来是否接近,就认为结构已经有效。
一种实现把左子树高度减去右子树高度作为平衡因子,允许的值为负一、零或一。节点保存的高度需要根据孩子重新计算,才能用局部记录判断插入或删除以后哪些祖先还需处理。
根据失衡方向选择旋转
若某一侧过高,旋转可以把较合适的孩子上移,缩短过深分支并保留键顺序。孩子本身的偏向还决定是否先对孩子旋转,再对原根旋转,形成两步调整;不能只凭插入发生在左边或右边就省略这一判断。
公开参考实现同时在插入与删除返回路径上更新子树大小、高度,并调用重平衡函数。修复后的局部根要交回上层连接;只移动节点而没有更新这些记录,会使后续查找以外的高度或计数操作失去依据。
参考:[2]
有序接口与性能边界
由于高度受约束,AVL可以为查找、插入、删除、最小键、最大键及上下界查询提供对数级最坏时间。这个结论与随机插入下普通搜索树的平均分析不同,保证来自持续维护的不变量。
Princeton的AVLTreeST示例用compareTo比较键,而不调用equals或hashCode,并在比较相等时更新已有键的值。它说明平衡机制与键的相等契约仍是两层规则:选择这种结构时,也要核对比较器表达的对象关系。
参考:[1]