Створення самостійного замовлення бінарного дерева


20

У мене є завдання, де мені потрібно скористатись двійковим деревом пошуку та змінити його, щоб самозамовитись таким чином, щоб елементи, до яких звертається найбільше (мають більший пріоритет), були у верхній частині дерева, корінь - самий доступний вузол .

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

Відповіді:


12

Всього два покажчики:

  1. Якщо ви хочете насправді поєднати ідеї черг із пріоритетом та дерев бінарного пошуку, подумайте про поєднання купи та BST в одній структурі.
  2. Існує концепція самоорганізуючих списків . Ідея полягає в тому, щоб перенести недавно доступний елемент на фронт (або назустріч), щоб прискорити майбутні доступи до того ж елемента, таким чином, «вивчивши» розподіл елементів у часі (з якістю залежить від конкретної реалізації). Може, ви можете пристосувати це до дерев?

Спойлер: Дотримуйтесь посилань нижче, лише якщо ви самі не змогли щось придумати.

1. Це називається віролом .
2. Сиві дерева реалізують цю ідею.


2

Погляньте на хитрі дерева, вони справді те, що вам потрібно. Вам доведеться змінити функцію відтворення, не переміщувати кожен доступний вузол до дерева, а повільно вгору


2
Чому він повинен був би зробити цю зміну? Або будь-яка стратегія є життєздатною , і є інші. Окрім того, це питання / було домашнім завданням, тому підказки віддають перевагу (не коментованим) рішенням. Нарешті, ця відповідь є надмірною, як є; можливо, ви можете змінити це, щоб вести ОП до запропонованого рішення?
Рафаель

Ну, кілька підказок для вас тоді: 1. Погляньте на функцію splay і подивіться, що вона робить, прочитайте питання та з’ясуйте, виходячи з того, що там сказано, чи змінюєте ви функцію splay чи ні. І ні, не всі стратегії є життєздатними, оскільки у нього є певні вимоги, які слід виконувати на основі пріоритету, тому переміщення на фронт весь час не є дійсним. 2. Некоментоване рішення? Як моя відповідь та некомментоване рішення? 3. "Як зайвий" ... Я не бачу, як ваша відповідь, ой, вибачте - натяки є остаточними, і моє "некомплікаційне рішення" приносить
помітку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.