定义:
一棵AVL树需要满足以下的条件:
- 它的左子树和右子树都是AVL树。
- 左子树和右子树的高度差不能超过1。
性质:
- 一棵n个节点的AVL树的其高度保持在O(log2(n))。
- 一棵n个节点的AVL树的平均搜索长度保持在O(log2(n))。
- 一棵n个节点的AVL树删除一个结点做平衡化旋转所需要的时间为O(log2(n))。
设计与实现:
高度
- 注:空节点高度为0,叶子节点的高度为1,根节点的高度最大;
1 | public function height($node) |
旋转
在新插入节点时,可能会破坏树的平衡性,这时需要利用旋转节点之间的链接关系来调整使之平衡
- RR型:调整方式为直接左旋:失衡根节点作旋转节点左孩子即可。
1 | public function leftRotate(&$node) |
- LL型:调整方式为直接右旋:失衡根节点作旋转节点右孩子即可。
1 | //[LL型:右旋转] |
- RL型:这种情况下单一左旋转不能满足二叉查找树特性要求,因此,需要先右旋转换为RR型,然后再左旋以满足平衡条件
1 | //[RL型:右旋-左旋] |
- LR型:该情况与RL型是对称的
1 | //[LR型:左旋-右旋] |
PHP代码实现
1 | class Node |
运行结果
1 | 中序遍历 |