バランスの取れたバイナリ検索ツリーは、O(log n)ルックアップ(または同様の操作)を保証するために不可欠です。多数のキーがランダムに挿入および/または削除される動的環境では、ツリーがルックアップにとって恐ろしいリンクリストに縮退する場合があります。したがって、この効果に対抗するさまざまな種類の自己バランス型バイナリツリー(AVLツリーやスプレイツリーなど)があります。これらのツリーは、ツリーのバランスを再調整するさまざまな種類の回転に基づいています。
回転
この課題では、単一の右回転のみを見ていきます。そのような回転(左回転は対称)は次のようになります。
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
葉のいずれか1
、4
または6
左または右のサブツリーがある場合、回転は単にそれらをそこに保持します。これがより大きなツリーのサブツリーである場合、ノードで単に「切断5
」し、回転したツリー(現在のノード3
)をそのノードに「再接続」します。
チャレンジ
バイナリ検索ツリー1とキーを指定すると、上記のようにそのノードでツリーが右回転します。上記の例で提供されるキーはになります5
。
ルールとI / O
- 選択したキーとテストケースのキーの間に全単射がある限り、任意のタイプのキーを使用できます。
[3,[]]
あいまいさがなければ(たとえば、特に指定しない限りあいまいです)、選択した言語に自然な限り、バイナリツリーの表現を選択できます。- 入力は常にバイナリ検索ツリーになるため、重複キーはありません
- あなたはキーがツリーに含まれていると仮定するかもしれません
- キーを含むノードには左の子があると仮定できます
- 提供されたキーの下に正しいサブツリーを想定することはできません
- あなたは、回転の前にツリーがアンバランスであると仮定することはできません
- 回転後にツリーのバランスが取れているとは思わないかもしれません
- デフォルトのI / O方式を使用できます
- あなたの提出は、ツリーを返す関数またはソリューションを印刷する完全なプログラムである可能性があります
テストケース
これらの例は、次のようなツリーを表します
- 葉の場合:
[]
- キー
x
を持つツリーで、両方のサブツリーがリーフの場合:[x]
- キー
x
とサブツリーを持つツリーの場合left
right
:[x,left,right]
最初の例は、セクションRotationsで提供されるものです。何らかの理由でそれらをグラフィカルに表示する必要がある場合は、ここで2に進みます。
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1:つまり、任意のノードで、左側のサブツリーのすべてのキーがそのキーよりも小さく、右側のサブツリーのすべてのキーがそれよりも大きいことを意味します
2:リンク腐敗を防ぐため、コメントとして埋め込みました
data B=B[B]Int
すると、さらにバイトが節約されます。