ちょっとそこ、 は、私は実際に両方のソリューションが正しいことだと思います。あなたの本が違うかもしれないいくつかの理由があると思います。ノードを挿入すると、2つの異なるノードのバランス係数が2になります。それはノード34とノード45でした。そのアルゴリズムがどのように機能するかは、挿入後です。それは、そのノードの高さを更新するとともに、バランス要素をチェックするルートノードに戻るパスに従います。私は根が最後にアクセスされ、回転のためにフラグが立てられていたので、それはそれがそうした理由です。別の潜在的な理由は、ルートノードの場合、回転は単純な回転を必要とし、一方、回転ノードは二重回転を必要とするということです。どちらにせよ、私は両方の答えが適切だと感じています。
私はAVLの木が何であるかを知らないかもしれない人のために、この問題を説明しようとするでしょう。私はこれのイラストにもラベルを貼ろうとしました。最初に行うことは、新しいノードを挿入する前に、開始するAVLツリーが要件を満たしていることを確認することです。各ノードの高さにラベルを付け、親ごとに子ノードの高さの違いを取得するだけです。
AVLの木は、すべてのノードの左と右の子供の高さは、せいぜい1または-1によって異なることが必要です。下から上へと、ID開始を挿入する前に、最初の図の例では(-1,0,1)
、。ノード87にはこれに対する子がありません。ノード45には子が1つしかないので、87の0の高さを計算します。ノード3には子がないので、これも0になります。ノード34には2つの子、3と45があります。その違いは1だけです。すべてのノードがAVLツリーテストに合格しています。
次ちょうどちょうどバイナリ検索ツリーのようにそれを横断してノードを挿入します。
ノードの高さを挿入後に変更し、ノードごとに再度比較します。今回は、ノード34(ルートノード)が子ども(2-0)に「2」の違いがあることがわかります。ノード34に回転が必要であることがわかりました。
単純な左回転を実行し、AVLプロパティが満たされました。
60の代わりに65を意味しますか? – Codor
申し訳ありません、はい - それに応じて私の質問を編集しました。 – Konrad
*は与えられたノード*の有効な "AVL-tree"とAdelson-VelskiとLandisが記述した入力アルゴリズムを実行した結果の違いです。 – greybeard