1. 程式人生 > >平衡二叉樹之AVL樹的旋轉

平衡二叉樹之AVL樹的旋轉

平衡二叉樹是基於二叉排序樹(或者也叫二叉搜尋樹)實現的一種自平衡的二叉樹,實現方法有比如:AVL樹、紅黑樹等等

二叉搜尋樹定義(維基百科):

二叉查詢樹(英語:Binary Search Tree),也稱二叉搜尋樹、有序二叉樹(英語:ordered binary tree),排序二叉樹(英語:sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:

1.若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
2.若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
3.任意節點的左、右子樹也分別為二叉查詢樹;
4.沒有鍵值相等的節點。

二叉查詢樹相比於其他資料結構的優勢在於查詢、插入的時間複雜度較低。為O(log n)

平衡二叉樹定義(維基百科):

平衡二叉搜尋樹(Balanced Binary Tree)是一種結構平衡的二叉搜尋樹,即葉節點深度差不超過1,它能在O(log n)內完成插入、查詢和刪除操作,最早被髮明的平衡二叉搜尋樹為AVL樹。

二叉查詢樹插入的時候很快,但是它可能會退化為線性連結串列,所以查詢的時候有可能時間複雜度為O(n)

如圖:

這裡寫圖片描述

但是平衡二叉樹插入的時候會自動平衡讓它任何節點的左右子節點的高度差不超過1,主要是通過樹的旋轉來解決。

以AVL樹來做一個說明,其中數的旋轉有兩種:一種是左旋,一種是右旋。
有的時候通過一次旋轉就能維持平衡,而有的時候需要兩次。主要有四種情況,左左、左右、右左,右右,其中左左和右右是隻需要一次旋轉,而左右和右左需要兩次旋轉,具體如下:

這裡寫圖片描述

1-1左左模式和1-4右右模式只需要旋轉一次,其中旋轉的方式是一樣的,而旋轉方向不同而已,下面就拿一個左左的方式:

這裡寫圖片描述

根節點的左邊的深度為減去右邊的深度差值為2,說明並不滿足平衡二叉樹,所以需要進行旋轉,根據分析是左邊深度大於右邊,並且超出的節點2的父節點於祖父節點的左邊,所以是左左模式,及需要進行右旋,右旋的時候將節點3作為根節點,節點5像右邊作為節點3的右子節點,並且將節點4斷開和節點3的連線然後再作為節點5的左子節點,旋轉完成(其中右右模式同理,左旋就行了,旋轉是一樣的只是方向不一樣而已)。

1-2左右和1-3右左都需要旋轉兩次,方向不一樣而已操作一樣,就拿1-2左右來說,如下圖所示:

這裡寫圖片描述

第一次旋轉:將二叉樹的1、2、3、4節點抽出來進行左旋,得到後面的樹然後再結合5、6節點變成最後一個二叉樹,第一次旋轉得到的二叉樹是一個左左模式。

然後根據左左模式進行右旋,即可得到平衡二叉樹:

這裡寫圖片描述

第二次旋轉:然後將這個第一次旋轉的左左模式二叉樹安裝圖1-1進行右旋即可,最終得到一個AVL樹。