2.4平衡二叉樹
背景:平衡二叉樹首先是二叉排序樹。基於二叉排序樹,發現樹越矮查找效率越高,進而發明了二叉平衡樹
2.4.1平衡二叉樹的定義
平衡因子(BF Balance factor):BF(T)=hL-hR,其中hL和hR分別為T的左、右子樹的高度。
平衡二叉樹(Balanced Binary Tree)(AVL樹):空樹或者任一結點左、右子樹高度差的絕對值不超過1,即|BF(T)<=1|。
2.4.2平衡二叉樹的調整
- 調整之后保證仍然是搜索樹
- 從離插入結點最近的結點調整
2.4.2.1RR旋轉、
定義:
“麻煩結點(BR的孩子)”在“發現者(A)”右子樹的右邊,因而叫RR插入,需要RR旋轉。

示例:

代碼:
1 typedef struct TreeNode* AVLTree; 2 struct TreeNode 3 { 4 int data; 5 AVLTree left; 6 AVLTree right; 7 }; 8 9 AVLTree RR(AVLTree A) { 10 AVLTree B = A->right; 11 A->right = B->left; 12 B->left = A; 13 return B; 14 }
2.4.2.2LL旋轉
定義:
“麻煩結點(BL的孩子)”在“發現者(A)”左子樹的左邊,因而叫LL插入,需要LL旋轉。

代碼:
1 AVLTree LL(AVLTree A) { 2 AVLTree B = A->left; 3 A->left = B->right; 4 B->right = A; 5 return B;//新的根結點 6 }
2.4.2.3LR旋轉
定義:
“麻煩結點(CL或者CR或者兩者的孩子)”在"發現結點(A)"的左子樹的右邊,因而叫LR插入,需要LR旋轉。

示例:
【分析】插入3之后1、4、6的平衡都被破壞了,但是1是距離3最近的結點,故以1為准,3在結點1右子樹的右邊做RR旋轉。

2.4.2.4RL旋轉
定義:
“麻煩結點(CL或者CR或者兩者的孩子)”在"發現結點(A)"的右子樹的左邊,因而叫LR插入,需要LR旋轉。

平衡二叉樹的實現可見 https://blog.csdn.net/qq_29762941/article/details/81040916
