2017-06-16 87 views
1

我試圖實現代碼來實現平衡二叉搜索樹的方式(蠻力),並且我發現有一個(樹的)情況,它似乎不能平衡。樹是這個二叉樹可以平衡嗎?

  6 
      \ 
      10 
     /
     8 
     /\ 
     7 9 

可以很明顯的發現,這個樹的右側高度比左高度大得多,所以我向左旋轉周圍的樹「6」,那麼新的樹會

 10 
    /
    6 
     \ 
     8 
    /\ 
    7 9 

然後它變成左邊的高度比右邊的高度大得多,所以在下一步中我必須向右旋轉(返回)節點'10'周圍的樹。

在平衡此樹時,似乎必須有一個無限循環來繞着它的根節點旋轉此樹(旋轉左,右,左,右...等等)。有沒有解決這個樹的解決方案?

+0

查看最大堆或最小堆。這可能會幫助你學習如何創建一個平衡的二叉樹。 – denis

回答

2

你不應該首先圍繞根旋轉,而應該首先旋轉右邊的子樹,因爲它也是不平衡的。

 10 
    /
    8 
    /\ 
    7 9 

應旋轉,並轉換爲

 8 
    /\ 
    7 10 
    /
    9 

那棵樹會

6 
    \ 
    8 
    /\ 
    7 10 
    /
    9 

然後你身邊根旋轉

8 
/\ 
    6 10 
    \ /
    7 9 
+0

非常感謝你!我發現我很尷尬!這是一個很好的解釋! –

+0

對不起,傑裏,我面對另一個二叉搜索樹,1 - > 3 - > 2,我試圖平衡這棵樹(實際上它是一棵子樹),但它被卡在一個循環。是否有可能平衡該二叉搜索樹? –

+0

@DavidHsu,這是一種情況,你需要先旋轉3> 2,然後把2放到根(雙旋轉)。我建議你閱讀一些自學平衡二叉搜索樹的標準實現的教科書。一個常見的實現是AVL樹,你可以在這裏參考https://en.wikipedia.org/wiki/AVL_tree的wikipage。雙輪案例正是你在這裏遇到的。 –

1

這樣做的最簡單的算法是:

  1. 連續服用3個節點在這棵樹(在你的情況下6,8,10)
  2. 爲了這些節點
  3. 附加在原有的子樹順序:空,7,9,空

這將產生:

 8 
/ \ 
    6  10 
/\ /\ 
. 7 9 . 

這棵樹非常平衡。

+0

非常感謝你!我發現我很尷尬!這是一個很好的解釋! –

+0

然後請upvote我的答案。 –