Saya memiliki tugas di mana saya perlu menggunakan pohon pencarian biner dan mengubahnya menjadi memesan sendiri sehingga item yang paling banyak diakses (memiliki prioritas lebih tinggi) berada di bagian atas pohon, root menjadi simpul yang paling banyak diakses .
Profesor memberi saya BST dan node struct untuk dikerjakan, tetapi mencoba untuk membuat kepala saya di sekitar algoritma untuk memperbarui pohon ketika hal-hal yang dimasukkan membingungkan saya.
Saya tahu bahwa ketika penyisipan terjadi, ia memeriksa apakah data node saat ini kurang atau lebih besar dari node saat ini, kemudian secara rekursif berjalan ke arah yang benar sampai menemukan pointer nol dan memasukkannya sendiri di sana. dan setelah dimasukkan itu meningkatkan prioritas sebesar 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
}
Sekarang saya perlu mencari tahu kapan simpul itu sama, bagaimana cara memesan ulang pohon sehingga simpul saat ini (yang sama dengan simpul yang sudah ada) menemukan simpul yang ada, meningkatkan prioritas simpul itu, kemudian menggesernya ke atas jika root adalah prioritas yang lebih rendah.
Saya pikir saya punya ide bahwa logika AVL akan bekerja, dan ketika pergeseran akan terjadi, itu akan menjadi satu putaran kanan atau satu putaran kiri.
Di sinilah saya bingung, tidak benar-benar tahu harus mulai dari mana dengan membuat algoritma untuk menyelesaikan masalah. Karena algoritma AVL bekerja dengan melacak keseimbangan pohon, kemudian memutar simpul ke kiri atau ke kanan, pohon ini tidak perlu khawatir tentang keseimbangan, hanya saja simpul dengan prioritas tertinggi tidak memiliki anak dengan prioritas lebih tinggi .
sumber