平衡二叉樹


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM