我有一个作业,需要使用二叉搜索树并将其更改为自身自定序,以使访问最多(优先级更高)的项目位于树的顶部,根是访问最多的节点。
教授给了我可以使用的BST和节点结构,但是在插入事物时试图让我的脑袋绕开更新树的算法,这使我感到困惑。
我知道随着插入的进行,它会检查当前节点的数据是否小于或大于当前节点,然后递归地以正确的方向运行,直到找到空指针并将其自身插入那里。并将其插入后将优先级增加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
}
现在,我需要弄清楚何时该节点相等,如何对树重新排序,以便当前节点(等于一个已经存在的节点)找到现有节点,增加该节点的优先级,如果root是较低的优先级。
我认为我的想法是AVL逻辑会起作用,并且当发生移位时,它将是向右旋转一次或向左旋转一次。
这是我很困惑的地方,真的不知道从哪里开始创建算法来解决问题。由于AVL算法可以跟踪树的平衡,因此可以相应地左右旋转节点,因此该树无需担心平衡,只是优先级最高的节点没有优先级较高的子节点。