У мене є завдання, де мені потрібно скористатись двійковим деревом пошуку та змінити його, щоб самозамовитись таким чином, щоб елементи, до яких звертається найбільше (мають більший пріоритет), були у верхній частині дерева, корінь - самий доступний вузол .
Професор дав мені BST і структуру вузлів, з якими я працюю, але спроба обвести головою алгоритм оновлення дерева, коли речі вставляються, мене бентежить.
Я знаю, що коли вставка відбувається, вона перевіряє, чи є дані поточного вузла меншими або більшими, ніж поточний вузол, а потім рекурсивно йде в правильному напрямку, поки не знайде нульовий покажчик і вставить себе туди. і після його введення збільшується пріоритет на 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 буде працювати, і коли відбудеться зсув, це буде одне праворуч обертання або одне обертання ліворуч.
Ось де я плутаюся, насправді не знаю, з чого почати зі створення алгоритму для вирішення проблеми. Оскільки алгоритм AVL працює з відстеженням балансу дерева, а потім, обертаючи вузли ліворуч або праворуч відповідно, це дерево не потрібно турбуватися про збалансованість, лише те, що у вузлах з найвищим пріоритетом не мають дітей з більш високим пріоритетом .