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

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

OghmaOsiris
источник

Ответы:

12

Всего два указателя:

  1. Если вы действительно хотите объединить идеи очередей с приоритетами и деревьев двоичного поиска, подумайте об объединении кучи и BST в одну структуру.
  2. Есть концепция самоорганизующихся списков . Идея состоит в том, чтобы переместить элемент, к которому недавно был получен доступ, (или в направлении) вперед, чтобы ускорить последующий доступ к тому же элементу, таким образом «изучая» распределение элемента во времени (с качеством, зависящим от конкретной реализации). Может быть, вы можете адаптировать это к деревьям?

Спойлер: Перейдите по ссылкам ниже, только если вы не смогли придумать что-то самостоятельно.

1. Это называется треп .
2. Splay деревья реализуют эту идею.

Рафаэль
источник
2

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

Bober02
источник
2
Почему он должен был сделать это изменение? Любая стратегия жизнеспособна , и есть другие. Кроме того, это / было домашнее задание, поэтому подсказки предпочтительнее (без комментариев) решений. Наконец, этот ответ является излишним, как есть; Может быть, вы можете изменить его, чтобы привести ОП к вашему предложенному решению?
Рафаэль
Итак, пара советов для вас: 1. Посмотрите на функцию Splay и посмотрите, что она делает, прочитайте вопрос и выясните, основываясь на том, что он говорит, изменили ли вы функцию Splay или нет. И нет, не все стратегии жизнеспособны, так как он предъявляет определенные требования, основанные на приоритете, поэтому сдвиг вперед всегда недопустим. 2. Не комментированное решение? Как мой ответ и без комментариев решение? 3. «Избыточный как он есть» ... Я не понимаю, как ваш ответ, ой, извините - подсказки являются окончательными, и мое «некомментированное решение» приносит
примечание