平衡二叉樹(Balanced Binary Tree),也稱為AVL樹,是一種自平衡二叉搜索樹(Self-Balancing Binary Search Tree)。平衡二叉樹在插入或刪除元素時,會通過平衡操作(Rebalance)保持樹的左右子樹高度差的絕對值不超過1,保證樹的高度是近似于log(n)級別的,從而保證查找、插入及刪除等操作的時間復雜度為log(n)級別。
特點
平衡二叉樹的主要特點如下:
- 每個節點最多有兩個子樹;
- 左子樹和右子樹的高度差不能超過1;
- 左子樹和右子樹都是一棵平衡二叉樹。
實現
平衡二叉樹是二叉搜索樹的一種優化,因此它的節點需要存儲和維護以下信息:
- 左右子樹指針;
- 節點值;
- 節點高度。
其中,節點高度指的是當前節點到它的最遠葉子節點的距離。因此,節點高度為0的表示葉子節點,而節點高度為1的表示只有一個子節點的節點。
平衡二叉樹的實現主要包括以下三個操作:
插入操作
向平衡二叉樹中插入一個新節點時,需要從根節點開始搜索,找到新節點應該被插入的位置。如果新節點與已存在的節點值相同,則可以選擇直接替換或者忽略該節點。
插入新節點后,從新節點父節點開始向上遍歷,直到達到根節點或者找到一個節點的左右子樹高度差超過1的節點。對于遇到的每個失衡節點,都需要進行平衡操作,以保證樹的平衡。
刪除操作
從平衡二叉樹中刪除一個節點時,首先需要從根節點開始搜索到要刪除的節點。如果要刪除的節點沒有子節點,則可以直接刪除;如果有一個子節點,則需要用該子節點替換要刪除的節點;如果有兩個子節點,則可以選擇替換為左子樹中最大節點或者右子樹中最小節點。
刪除節點后,從其父節點開始向上遍歷,直到達到根節點或者找到一個節點的左右子樹高度差超過1的節點。對于遇到的每個失衡節點,都需要進行平衡操作,以保證樹的平衡。
平衡操作
平衡操作是平衡二叉樹的核心。當插入或刪除節點后,使得子樹高度差超過1時,就需要對該子樹進行平衡操作。
平衡操作可以通過旋轉操作實現。旋轉操作可以分為左旋和右旋兩種,分別對應左子樹失衡和右子樹失衡的情況。
左旋操作
[圖片上傳失敗...(image-b3aebb-1682412631906)]
對于如上圖所示的右子樹失衡情況,在節點4處進行左旋操作。左旋操作順時針將節點4向下移到節點6的左子樹上,同時節點6向上移到新的子樹根節點位置。此時,節點4、6、2這個子樹高度變為了2,同時根節點4的右子樹高度也變為了2,樹平衡。
右旋操作
[圖片上傳失敗...(image-f81d9a-1682412631906)]
對于如上圖所示的左子樹失衡情況,在節點6處進行右旋操作。右旋操作逆時針將節點6向下移到節點4的右子樹上,同時節點4向上移到新的子樹根節點位置。此時,節點4、6、8這個子樹高度變為了2,同時根節點6的左子樹高度也變為了2,樹平衡。
總結
平衡二叉樹是一種自平衡二叉搜索樹,可以保證查找、插入及刪除等操作的時間復雜度為log(n)級別。平衡二叉樹通過平衡操作保持樹的左右子樹高度差的絕對值不超過1,從而保證樹的高度近似于log(n)。平衡二叉樹的主要操作包括插入、刪除和平衡操作,通過旋轉操作實現平衡操作。