平衡二叉樹定義(AVL):它或者是一顆空樹,或者具有以下性質的二叉樹:它的左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹都是一顆平衡二叉樹。
最小不平衡子樹:指離插入節點最近且以平衡因子的絕對值大於1的節點作為根的子樹。
平衡因子(bf):結點的左子樹的深度減去右子樹的深度,那么顯然-1<=bf<=1;
很顯然,平衡二叉樹是在二叉排序樹(BST)上引入的,就是為了解決二叉排序樹的不平衡性導致時間復雜度大大下降,那么AVL就保持住了(BST)的最好時間復雜度O(logn),所以每次的插入和刪除都要確保二叉樹的平衡,那么怎么保持平衡呢?
插入操作
在平衡二叉樹中插入結點與二叉查找樹最大的不同在於要隨時保證插入后整棵二叉樹是平衡的。那么調整不平衡樹的基本方法就是: 旋轉,基本思路都是轉換到左旋和右旋。
1) 右旋: 在最小平衡子樹根節點平衡因子>=2且在根節點的左孩子的左孩子插入元素,進行右旋
2) 左旋: 在最小平衡子樹根節點平衡因子>=-2且在根節點的右孩子的右孩子插入元素,進行左旋。
3) 右左:最小平衡子樹根節點(80)的右孩子(100)的左孩子(90)的子節點(95)插入新元素,先繞根節點的右孩子節點(100)右旋,再圍根節點(80)左旋
4) 左右:在最小平衡子樹根節點(80)的左孩子(50)的右孩子(70)的子節點插入新元素,先繞根節點的左孩子節點(50)右旋,再圍根節點(80)左旋