我有一個任務,我需要使用二叉搜索樹並將其自行更改為自我排序,以便訪問最多(優先級較高)的項目位於樹頂部,根是訪問最多的節點。
教授給了我BST和節點結構來處理,但試圖讓我的頭腦圍繞算法更新樹,因為插入的東西令我感到困惑。
我知道,隨著插入的發生,它會檢查當前節點的數據是否小於或大於當前節點,然後遞歸地朝正確的方向前進,直到找到空指針並將其插入到那裏。並且在插入之後它將優先級提高1。
template
void BinarySearchTree :: insert( const Type & x, BinaryNode * & t )
{
if( t == NULL )
t = new BinaryNode( 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
}
現在我需要弄清楚節點何時相等,如何重新排序樹,以便當前節點(等於已存在的節點)找到現有節點,增加該節點的優先級,然後如果根是一個較低的優先級。
我認為我有這樣的想法,即AVL邏輯可以工作,並且當發生轉變時,它將是一個單旋轉右旋或左旋單旋轉。
這是我很困惑的地方,真的不知道從哪裏開始創建算法來解決問題。由於AVL算法跟蹤樹的平衡,然後相應地左右旋轉節點,因此該樹不必擔心被平衡,只是具有最高優先級的節點不具有具有更高優先級的子節點。