自己順序付けバイナリツリーの作成


20

バイナリ検索ツリーを使用して自己アクセス順序に変更する必要がある割り当てがあり、最もアクセスされる(優先度が高い)アイテムがツリーの最上部にあり、ルートが最もアクセスされるノードです。

教授は私に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アルゴリズムはツリーのバランスを追跡し、それに応じてノードを左右に回転させるので、このツリーはバランスがとれていることを心配する必要はありません。最高の優先度を持つノードには、より高い優先度を持つ子がいないだけです。

回答:


12

ただ2つのポインター:

  1. 優先度キューとバイナリ検索ツリーのアイデアを実際に組み合わせたい場合は、ヒープとBSTを1つの構造に組み合わせることを検討してください。
  2. の概念があります 自己組織化リストのます。考え方は、同じ要素への将来のアクセスを高速化するために、最近アクセスした要素を最前面に(または前方に)移動することです。たぶん、これを木に適応させることができますか?

ネタバレ:自分で何かを思いつかなかった場合にのみ、以下のリンクをたどってください。

1.これはtreapと呼ばれます。
2. スプレイツリーはこのアイデアを実装します。


2

スプレイツリーを見てください。本当に必要なものです。アクセスした各ノードをツリーまで移動するのではなく、ゆっくりと上に移動するために、スプレイ関数を変更する必要があります


2
なぜ彼この変更をしなければならないのでしょうか?どちらの戦略も実行可能であり、他にもあります。また、これは宿題の質問であったため、ヒントは(コメントを外した)ソリューションよりも優先されます。最後に、この答えはそのまま冗長です。おそらく、提案されたソリューションに向けてOPを導くために変更できますか?
ラファエル

それでは、いくつかのヒントを次に示します。1. splay関数を見て、その機能を確認し、質問を読んで、splay関数を変更するかどうかに応じて、その内容に基づいて把握します。いいえ、彼は優先順位に基づいて満たすべき特定の要件があるため、すべての戦略が実行可能であるわけではありません。私の答えとコメントされていないソリューションはどうですか?ヒントは、究極のであり、私の「コメントのないソリューションは、」テーブルに注目します- 3.「そのまま冗長」...私はどのようにあなたの答え、おっと、申し訳ありませんが表示されない
Bober02
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.