數據結構---二叉樹(2)---平衡二叉樹(3)

0.簡介

前面分析了平衡二叉樹是怎麼調整平衡的,這裏就來解決另一個問題,平衡二叉樹理論爲什麼能成立?難道就不會有怎麼調都不會平衡的情況嗎?一起探究一下吧。

1.平衡二叉樹

我在很早的時候就注意到了一個問題。

二叉樹變形

上圖中是一顆不平衡的二叉樹向平衡調整的一部分過程,這個過程中我發現,子樹a,b,c,d的左右關係始終都是不變的,就是從左到右來看始終都是a,b,c,d這個順序,並且圓圈裏的BCA這三個節點的順序也始終都是不變的,那變化的是什麼呢?從圖中我們只能觀察到,變化的是樹的形狀。

因爲平衡二叉樹是按照左小,右大的方式存儲的,正是這個關係帶來了一些有趣的性質。

平衡調整

上圖中是一顆不平衡的二叉樹調整爲平衡的二叉樹,由於左小右大這個順序限制,這兩個樹的中序遍歷都是有序的,不僅如此,兩個樹的中序序列是一樣的,爲什麼中序序列是有序的就不多解釋了,我們關注爲什麼中序序列是一樣的。

因爲兩個樹的左右子樹都有大小關係的約束,所以就導致了兩個樹的中序序列是相同的,假如我們將中序序列存儲在數組中,那麼當我們向其對應的二叉樹中插入一個數字的時候,是不是很像用二分查找往數組裏插入一個數字?那麼我們利用平衡二叉樹訪問一個數字的時候,是不是很像在這個有序的中序遍歷形成數組中用二分查找去找某個數?

然而當向樹中插入新節點的時候,再調整平衡,調整前後中序序列不變,但是樹的形狀變了。我們再看如果是利用二分查找往有序數組裏插入一個數字後,當再次進行二分查找某個數字的時候,是不是有可能插入前後的二分查找路徑變了?

那麼我們猜想,平衡二叉樹是不是對應着某個有序序列的二分查找路徑呢?或者說排序查找樹就對應着一個有序序列的二分查找路徑,我們單獨看二分查找,查找的時間複雜度是O(logn),因爲每次查找的時候,查找的入口都是有序序列的正中間,因爲序列存儲在數組中,所以可以很容易的計算出數組的中間的位置,從而使得查找深度維持在O(logn),假如我們將查找的入口固定不變,然後始終用固定的二分路線向數組中插入數字。如下圖

二分插入

看起來就像普通的二叉查找樹插入數字一樣,固定了查找入口,如果是正常的二分查找,每次都要計算從哪個數字開始查找的,最終使得從入口到終點,每條查找路徑都近乎一樣長,就算有差別,相差長度也不會超過1,注意前面那句話,這和平衡二叉樹的規則有點相似,兩端子樹之差不超過1,我能想到的是,平衡二叉樹每次調整平衡就是類似二分查找一樣,是在尋找一個最佳的中間點作爲入口,因爲二分查找是數組中,所以可以很方便的找到最靠近中間的數字,而樹就需要麻煩一些了,換句話說,平衡二叉樹中每次調整的不是數據的順序,而是訪問路徑,就像是鏈表版本的二分查找,那麼二分查找符合的性質平衡二叉樹基本都應該具備。

那麼對於一個有序數組,利用二分查找,總能找到一個最佳的訪問路徑,使得每條路徑都幾乎一樣並且最大差不超過1,並且查找深度都能維持在O(logn),對於鏈表版本的二分查找平衡二叉樹來說,樹總能調整到平衡的狀態,也是最優的狀態,這裏我們不再將平衡二叉樹理解爲數據,而是訪問數據的路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章