创建自排序二叉树


20

我有一个作业,需要使用二叉搜索树并将其更改为自身自定序,以使访问最多(优先级更高)的项目位于树的顶部,根是访问最多的节点。

教授给了我可以使用的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算法可以跟踪树的平衡,因此可以相应地左右旋转节点,因此该树无需担心平衡,只是优先级最高的节点没有优先级较高的子节点。

Answers:


12

仅两个指针:

  1. 如果您想将优先级队列和二进制搜索树的思想真正结合起来,请考虑将堆和BST结合在一个结构中。
  2. 自组织列表的概念。这个想法是将最近访问的元素移到(或移向)前面,以加快将来对同一元素的访问,从而“学习”元素随时间的分布(其质量取决于特定的实现)。也许您可以使它适应树木?

剧透:仅当您自己无法提出建议时,请点击以下链接。

1.这被称为treap
2. Splay树实现了这个想法。


2

看看八卦树,它们确实是您所需要的。您将不得不修改splay函数,而不是将每个访问的节点一直移动到树上,而是缓慢向上移动


2
为什么他做出这种改变?每种策略都是可行的,还有其他策略。此外,这是(是)一个家庭作业问题,因此,提示(而不是注释)解决方案更可取。最后,这个答案实际上是多余的。也许您可以对其进行更改以将OP引向您提出的解决方案?
拉斐尔

好了,然后为您提供了一些提示:1.看看splay函数并查看它的作用,阅读问题并根据其内容,找出是否修改splay函数。不,不是所有的策略都是可行的,因为他基于优先级有一定的要求要满足,因此一直转移到最前面是无效的。2.无评论的解决方案?我的答案和未评论的解决方案如何?3.“原样冗余” ...我看不到您的回答,哎呀,对不起-提示是最终的,我的“未注释的解决方案”引起了大家的注意
Bober02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.