2017-06-16 12 views
1

私は、二分探索木のバランスをとる方法(ブルートフォース)を実装するコードを実装しようとしていた、と私は(木の)場合があることを発見し、それはバランスをとることができないようです。ツリーには、あなたは明らかにこのツリーの右側の高さは、その左側の高さよりもはるかに大きいので、私は周りの木を左に回転させる「6」、そして新しい木がこのバイナリツリーのバランスを取ることはできますか?

 10 
    /
    6 
     \ 
     8 
    /\ 
    7 9 
になることを見つけることができます

  6 
      \ 
      10 
     /
     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回置く必要がある(ダブルローテーション)場合です。自己平衡バイナリ検索ツリーのいくつかの標準実装のためのテキストを読んでください。 1つの一般的な実装はAVLツリーで、wikipageはhttps://en.wikipedia.org/wiki/AVL_treeを参照してください。二重回転のケースはあなたがここで出会ったものです。 –

1

これを行うための最も簡単なアルゴリズムである:

  1. それらのノード
  2. は、元のサブツリーを取り付ける
  3. 順(6、8、10、あなたの場合には)、このツリー内の3つの連続したノードを取ります順序:空、7、9、

空生じるであろう:

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

この木はかなりバランスが取れています。

+0

ありがとうございます!私はとても厄介だと分かった!!それは素晴らしい説明です! –

+0

それから私の答えをupvoteしてください。 –

関連する問題