Ben bir ikili arama ağacı kullanmak ve kendini en çok erişilen (daha yüksek bir önceliğe sahip) öğeleri ağacın üstünde, kök en çok erişilen düğüm olacak şekilde kendi kendini değiştirmek için gereken bir atama var .
Profesör bana çalışmak için BST ve düğüm yapısını verdi, ancak işler eklenirken ağacı güncellemek için algoritmamın etrafında dolaşmaya çalışmak beni karıştırıyor.
Ekleme olurken, geçerli düğümün verilerinin geçerli düğümden daha az veya daha büyük olup olmadığını denetler, sonra boş bir işaretçi bulana ve kendini oraya ekleyene kadar yinelemeli olarak doğru yönde gider. ve yerleştirildikten sonra önceliği 1 arttırır.
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
}
Şimdi düğüm eşit olduğunda, mevcut düğümün (zaten var olan bir düğüme eşit olan) mevcut düğümü bulması, düğümün önceliğini arttırması için ağacın nasıl yeniden sıralanacağını anlamaya ihtiyacım var. Kök daha düşük bir önceliktir.
Sanırım AVL mantığının işe yarayacağı ve bir vardiya gerçekleşeceği zaman, sağa tek bir dönüş ya da tek bir dönüş olacağını düşünüyorum.
Burada kafam karıştı, sorunu çözmek için bir algoritma oluşturmaya nereden başlayacağımı bilmiyorum. AVL algoritması bir ağacın dengesini takip ederek çalıştığından, düğümleri buna göre sola veya sağa döndürdüğünden, bu ağacın dengelenme konusunda endişelenmesine gerek yoktur, sadece en yüksek önceliğe sahip düğümlerin daha yüksek önceliğe sahip çocukları yoktur. .