写在前面
本文是在Binary Search Tree的基础上讨论构建AVL树,了解Binary Search Tree 戳我
AVL 树
定义:AVL树是具有以下性质的二叉搜索树:
- 在AVL树中任何节点的两个子树的高度最大差值为1。
- 插入或删除操作可能需要通过一次或多次树旋转来重新平衡这个树。
AVLTree 和二叉搜索树

AVL树相比于二叉搜索树的优势在于: 查找、插入、删除的平均和最坏时间复杂度均为O(log n)。
旋转操作
前面提到,在执行插入或删除操作后可能需要通过一次或多次树旋转来重新平衡这个树。
基本旋转操作
基本的旋转操作为左旋、右旋:
1 | T1, T2 和 T3是以y (左侧) 或 x (右侧)为根的子树,两棵树可以在不打破BST属性的情况下通过右旋(左旋)进行转换 |
代码实现:
1 | //左旋操作 |
case分析
以z为根节点,x、y为子节点的不平衡二叉搜索树可能有四种排列:
- y是z的左边孩子,x是y的左边孩子(Left Left Case)
- y是z的左边孩子,x是y的右边孩子(Left Right Case)
- y是z的右边孩子,x是y的右边孩子(Right Right Case)
- y是z的右边孩子,x是y的左边孩子 (Right Left Case)
对于不同的case 需要执行不同的选择操作组合来使树重新达到平衡:
Left Left Case
单次右旋z 达到平衡
1 | T1, T2, T3 和 T4 为子树. |
Left Right Case
左旋y 右旋z达到平衡
1 | T1, T2, T3 和 T4 为子树. |
Right Right Case
单次左旋达到平衡
1 | T1, T2, T3 和 T4 为子树. |
Right Left Case
右旋y 左旋z达到平衡
1 | T1, T2, T3 和 T4 为子树. |
完整代码实现
.h 文件
1 | typedef struct avlTree_Node{ |
.c 文件
1 | p_AVLTree_Node newAVLNode(int member){ |
测试代码
1 | void testAVLTree(){ |
代码输出
1 | Preorder traversal of the constructed AVL tree is |
如果对你有帮助的话,Star✨下一吧!