Eu tenho uma atribuição na qual preciso usar uma árvore de pesquisa binária e alterá-la para se auto-ordenar, de modo que os itens mais acessados (tenham uma prioridade mais alta) estejam no topo da árvore, a raiz sendo o nó mais acessado .
O professor me deu o BST e a estrutura do nó para trabalhar, mas tentar entender o algoritmo para atualizar a árvore conforme as coisas estão sendo inseridas está me confundindo.
Sei que, à medida que a inserção está acontecendo, ele verifica se os dados do nó atual são menores ou maiores que o nó atual e depois recursivamente segue na direção correta até encontrar um ponteiro nulo e se inserir lá. e depois de inserido, aumenta a prioridade em 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
}
Agora eu preciso descobrir quando o nó é igual, como reordenar a árvore para que o nó atual (que é igual a um nó já existente) encontre o nó existente, aumente a prioridade desse nó e a mude se o raiz é uma prioridade mais baixa.
Acho que tenho a ideia de que a lógica do AVL funcionaria e, quando ocorresse uma mudança, seria uma rotação única para a direita ou uma única rotação para a esquerda.
Aqui é onde estou confuso, realmente não sei por onde começar com a criação de um algoritmo para resolver o problema. Como o algoritmo AVL trabalha para acompanhar o equilíbrio de uma árvore e, em seguida, girar os nós para a esquerda ou direita, essa árvore não precisa se preocupar em ser equilibrada, apenas para que os nós com a prioridade mais alta não tenham filhos com prioridade mais alta. .
fonte