前面分析了平衡二叉樹是怎麼調整平衡的,這裡就來解決另乙個問題,平衡二叉樹理論為什麼能成立?難道就不會有怎麼調都不會平衡的情況嗎?一起**一下吧。
我在很早的時候就注意到了乙個問題。
上圖中是一顆不平衡的二叉樹向平衡調整的一部分過程,這個過程中我發現,子樹a,b,c,d的左右關係始終都是不變的,就是從左到右來看始終都是a,b,c,d這個順序,並且圓圈裡的bca這三個節點的順序也始終都是不變的,那變化的是什麼呢?從圖中我們只能觀察到,變化的是樹的形狀。
因為平衡二叉樹是按照左小,右大的方式儲存的,正是這個關係帶來了一些有趣的性質。
上圖中是一顆不平衡的二叉樹調整為平衡的二叉樹,由於左小右大這個順序限制,這兩個樹的中序遍歷都是有序的,不僅如此,兩個樹的中序序列是一樣的,為什麼中序序列是有序的就不多解釋了,我們關注為什麼中序序列是一樣的。
因為兩個樹的左右子樹都有大小關係的約束,所以就導致了兩個樹的中序序列是相同的,假如我們將中序序列儲存在陣列中,那麼當我們向其對應的二叉樹中插入乙個數字的時候,是不是很像用二分查詢往陣列裡插入乙個數字?那麼我們利用平衡二叉樹訪問乙個數字的時候,是不是很像在這個有序的中序遍歷形成陣列中用二分查詢去找某個數?
然而當向樹中插入新節點的時候,再調整平衡,調整前後中序序列不變,但是樹的形狀變了。我們再看如果是利用二分查詢往有序陣列裡插入乙個數字後,當再次進行二分查詢某個數字的時候,是不是有可能插入前後的二分查詢路徑變了?
那麼我們猜想,平衡二叉樹是不是對應著某個有序序列的二分查詢路徑呢?或者說排序查詢樹就對應著乙個有序序列的二分查詢路徑,我們單獨看二分查詢,查詢的時間複雜度是o(logn),因為每次查詢的時候,查詢的入口都是有序序列的正中間,因為序列儲存在陣列中,所以可以很容易的計算出陣列的中間的位置,從而使得查詢深度維持在o(logn),假如我們將查詢的入口固定不變,然後始終用固定的二分路線向陣列中插入數字。如下圖
看起來就像普通的二叉查詢樹插入數字一樣,固定了查詢入口,如果是正常的二分查詢,每次都要計算從哪個數字開始查詢的,最終使得從入口到終點,每條查詢路徑都近乎一樣長,就算有差別,相差長度也不會超過1,注意前面那句話,這和平衡二叉樹的規則有點相似,兩端子樹之差不超過1,我能想到的是,平衡二叉樹每次調整平衡就是類似二分查詢一樣,是在尋找乙個最佳的中間點作為入口,因為二分查詢是陣列中,所以可以很方便的找到最靠近中間的數字,而樹就需要麻煩一些了,換句話說,平衡二叉樹中每次調整的不是資料的順序,而是訪問路徑,就像是鍊錶版本的二分查詢,那麼二分查詢符合的性質平衡二叉樹基本都應該具備。
那麼對於乙個有序陣列,利用二分查詢,總能找到乙個最佳的訪問路徑,使得每條路徑都幾乎一樣並且最大差不超過1,並且查詢深度都能維持在o(logn),對於鍊錶版本的二分查詢平衡二叉樹來說,樹總能調整到平衡的狀態,也是最優的狀態,這裡我們不再將平衡二叉樹理解為資料,而是訪問資料的路徑。
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹
一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2k 12 k 1 2k 1 則它就是滿二叉樹。若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。它或者是一顆空樹,或...