Algorithm 顺序遍历中的avl树

Algorithm 顺序遍历中的avl树,algorithm,traversal,avl-tree,Algorithm,Traversal,Avl Tree,设我们是一组动态整数。设n=| S |。描述S到S上的数据结构 以所需的性能保证支持S上的以下操作: •在O(对数n)时间内向S插入新元素 •在O(对数n)时间内从S中删除一个元素 •在O(k)时间内报告任何满足1的k个最小元素≤ K≤ n 您的结构必须始终消耗O(n)空间 我可以简单地构建一个AVL树,然后按顺序遍历打印出前3个元素吗 您建议的解决方案在O(k)时间内不起作用。开始顺序遍历需要O(logn)时间。即使在找到一个元素后停止,仍然需要首先到达最左边的叶子 我可以想出两种解决办法:

设我们是一组动态整数。设n=| S |。描述S到S上的数据结构 以所需的性能保证支持S上的以下操作:

•在O(对数n)时间内向S插入新元素

•在O(对数n)时间内从S中删除一个元素

•在O(k)时间内报告任何满足1的k个最小元素≤ K≤ n

您的结构必须始终消耗O(n)空间


我可以简单地构建一个AVL树,然后按顺序遍历打印出前3个元素吗

您建议的解决方案在O(k)时间内不起作用。开始顺序遍历需要O(logn)时间。即使在找到一个元素后停止,仍然需要首先到达最左边的叶子

我可以想出两种解决办法:

  • 使用a,它有O(logn)插入和删除,并且对基础列表进行排序。然而,插入和删除的时间复杂度是平均的,而不是最坏情况

  • 使用一个修改的、保留一个指向最左边节点的专用指针,并在插入和删除时更新它。此外,节点必须具有指向其父节点的指针,以便可以从最左侧的节点开始顺序遍历。或者使用一个


  • 使用优先级队列,该队列使用O(n)空间。插入和删除都是O(logn)操作。Find min是O(1),然后remove min是O(k),可以重复三次。

    我决定在根节点存储并更新最左侧的节点指针,并在每个节点上存储指向前置节点和后续节点的指针

    因此,每次插入都要花费O(logn)进行插入,并且O(logn)+O(logn)要找到前置和后继,O(logn)+O(logn)+O(logn)=O(logn)

    这些指针还允许在O(1)中插入后,受影响节点指针的更新分别移动到前置或后继,并在O(1)中更新这些指针


    将指针指向最左边的根节点意味着在O(1)处移动,然后在O(k)时间内遍历后续节点并打印前k个节点。

    可以[I]简单地构建一个AVL树并[使用顺序遍历打印前3个元素?
    100万个元素需要多少时间?100万个?a?标准答案是一个平衡的、线程化的二叉搜索树。这是一个BBST,它使用叶节点中的空指针。这些指针按排序将节点连接到一个接近链表的位置。在每次插入或删除(每次节点触摸的固定时间)时,您只能用O(logn)额外时间来维护指针。您可以在O(k)上列出前k个节点通过从列表的开头遍历来节省时间。有一个相当漂亮的实现,可以替代在内存不足的时候使用父引用的方法是-将引用添加到最左侧和/或最右侧的节点(不是叶节点)根据需要。有这些额外的指针会违反空间限制吗?@101ldaniels每个节点的指针数量是恒定的-空间复杂度仍然是O(n)in remove min is O(log n)你是对的。我的错。我将把这个答案留在这里提醒自己不要愚蠢。