Ho un compito in cui devo usare un albero di ricerca binario e modificarlo per auto-ordinarsi in modo tale che gli elementi a cui si accede di più (hanno una priorità più alta) siano nella parte superiore dell'albero, la radice essendo il nodo più accessibile .
Il professore mi ha dato il BST e la struttura del nodo con cui lavorare, ma cercare di aggirare l'algoritmo per aggiornare l'albero mentre le cose vengono inserite mi confonde.
So che mentre l'inserimento sta avvenendo, controlla se i dati del nodo corrente sono minori o maggiori del nodo corrente, quindi ricorsivamente va nella direzione corretta fino a quando non trova un puntatore nullo e si inserisce lì. e dopo che è stato inserito aumenta la priorità di 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
}
Ora ho bisogno di capire quando il nodo è uguale, come riordinare l'albero in modo che il nodo corrente (che è uguale a un nodo già esistente) trova il nodo esistente, aumenta la priorità di quel nodo, quindi lo sposta su se il root ha una priorità inferiore.
Penso di avere l'idea che la logica AVL avrebbe funzionato, e quando avrebbe avuto luogo uno spostamento, sarebbe stata una singola rotazione a destra o una singola rotazione a sinistra.
Ecco dove sono confuso, non so davvero da dove iniziare con la creazione di un algoritmo per risolvere il problema. Poiché l'algoritmo AVL funziona tenendo traccia dell'equilibrio di un albero, quindi ruotando i nodi a sinistra oa destra di conseguenza, questo albero non deve preoccuparsi di essere bilanciato, solo che i nodi con la massima priorità non hanno figli con una priorità più alta .