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