Tôi có một nhiệm vụ mà tôi cần sử dụng cây tìm kiếm nhị phân và thay đổi nó để tự đặt hàng sao cho các mục được truy cập nhiều nhất (có mức độ ưu tiên cao hơn) nằm ở đầu cây, gốc là nút được truy cập nhiều nhất .
Giáo sư đã cho tôi BST và cấu trúc nút để làm việc, nhưng cố gắng tìm hiểu về thuật toán để cập nhật cây vì mọi thứ đang được chèn vào làm tôi bối rối.
Tôi biết rằng khi quá trình chèn đang diễn ra, nó sẽ kiểm tra xem dữ liệu của nút hiện tại nhỏ hơn hoặc lớn hơn nút hiện tại, sau đó đi theo hướng chính xác cho đến khi tìm thấy một con trỏ null và tự chèn vào đó. và sau khi được chèn, nó tăng mức ưu tiên lên 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
}
Bây giờ tôi cần tìm ra khi nào nút bằng nhau, làm thế nào để sắp xếp lại cây sao cho nút hiện tại (bằng với nút đã có) tìm thấy nút hiện có, tăng mức độ ưu tiên của nút đó, sau đó chuyển nó lên nếu root là một ưu tiên thấp hơn.
Tôi nghĩ rằng tôi có ý tưởng rằng logic AVL sẽ hoạt động và khi một sự thay đổi diễn ra, nó sẽ là một vòng quay phải hoặc một vòng quay trái.
Đây là nơi tôi bối rối, không thực sự biết bắt đầu từ đâu với việc tạo ra một thuật toán để giải quyết vấn đề. Do thuật toán AVL hoạt động với việc theo dõi sự cân bằng của cây, sau đó xoay các nút sang trái hoặc phải, nên cây này không cần phải lo lắng về việc cân bằng, chỉ là các nút có mức độ ưu tiên cao nhất không có con có mức độ ưu tiên cao hơn .