平衡二叉搜索树
既然二叉搜索树的性能主要取决于高度,故在节点数目固定的前提下,应尽可能地降低高度。
相应地,应尽可能地使兄弟子树的高度彼此接近,即全树尽可能地平衡。
等价变换
等价二叉搜索树:若两棵二叉搜索树的中序遍历序列相同,则称它们彼此等价;反之亦然。
旋转调整
最基本的修复手段,通过围绕特定节点的旋转,实现等价前提下的局部拓扑调整。
zig和zag:
AVL树
平衡因子
任一节点v的平衡因子(balance factor)定义为“其左、右子树的高度差”,即:
balFac(v) = height(lc(v)) - height(rc(v))
所谓AVL树,即平衡因子受限的二叉搜索树其中各节点平衡因子的绝对值均不超过1。
1.接口定义
基于BST模板类,可以直接派生出AVL模板类
#include "../BST/BST.h" //基于BST实现AVL树
template <typename T> class AVL : public BST<T> { //由BST派生AVL树模板类
public:
BinNodePosi(T) insert(const T& e); //插入(重写)
bool remove(const T& e); //删除(重写)
// BST::search()等其余接口可直接沿用
};
为简化对节点平衡性的判断,算法实现时可借用以下宏定义:
#define Balanced(x) (stature((x).lChild) == stature((x).rChild)) //理想平衡条件
#define BalFac(x