バイナリ検索ツリーを使用して自己アクセス順序に変更する必要がある割り当てがあり、最もアクセスされる(優先度が高い)アイテムがツリーの最上部にあり、ルートが最もアクセスされるノードです。
教授は私にBSTとノード構造体を提供してくれましたが、挿入中にツリーを更新するアルゴリズムに頭を悩ませようとすると混乱します。
挿入が発生すると、現在のノードのデータが現在のノードより少ないか大きいかをチェックし、nullポインターを見つけてそこに挿入するまで再帰的に正しい方向に進みます。挿入された後、優先度が1増加します。
template <class Type>
void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t )
{
if( t == NULL )
t = new BinaryNode<Type>( x, NULL, NULL );
else if( x < t->element )
insert( x, t->left );
else if( t->element < x )
insert( x, t->right );
else
t->priority++; // Duplicate; do nothing for right now
}
ノードが等しいとき、現在のノード(既存のノードと等しい)が既存のノードを見つけ、そのノードの優先度を上げ、次にそれを上にシフトするようにツリーを並べ替える方法を把握する必要がありますルートは優先度が低いです。
私は、AVLロジックが機能し、シフトが発生すると、右に1回転または左に1回転になるという考えを持っていると思います。
ここで私が混乱しているのは、問題を解決するためのアルゴリズムの作成からどこから始めればよいのか、本当にわからないことです。AVLアルゴリズムはツリーのバランスを追跡し、それに応じてノードを左右に回転させるので、このツリーはバランスがとれていることを心配する必要はありません。最高の優先度を持つノードには、より高い優先度を持つ子がいないだけです。