AVLツリーを実装しようとしていますが、RRまたはRLローテーション(LLとLRで同じ)がいつ必要かを知るのに苦労しています。
それぞれの前提条件は何ですか、そしてそれらはどのように異なりますか。木の写真を(直感的に)見るとわかりますが、実際の状況はどうですか?
これは論理的な問題であり、コードは必要ありません。ありがとうございます。
私が知っているのは、木が重いままになっている、または右に重いままになっていることです。しかし、それをどのように判断しますか?
さまざまな解決策があるかもしれませんが、1つは次のとおりです。
項目を再帰的に追加する場合、各再帰呼び出しで、その呼び出しがノードを左または右のサブツリーに追加したかどうかを追跡する必要があります (たとえば、add 関数がそれを返すようにすることによって)。再帰呼び出しの後、高さ不変をチェックします。挿入後にそのノードで違反が見つかった場合は、不均衡へのパスがわかります。
いくつかの (不完全な) 疑似コード:
add(item, node):
if item < node.value //should add to left subtree
if node.left is empty
//add item here
else
addedLeft := add(item, node.left)
if node.left.height - node.right.height > 1
if addedLeft
//you know the path to the subtree causing the imbalance is LL, do a RR (single-right) rotation
else
//path is LR, do a LR (double-right) rotation
...
再帰呼び出しは、追加されたノードからボトムアップに展開されます。一般的な考え方は、不変条件に違反しているノード (存在する場合) をチェックすることです。そのノードが検出されたら、不均衡の原因となっているサブツリーへのパスを知る必要があります。どうにかしてその問題を解決しなければなりません。これが 1 つの解決策です。