avl树顺序遍历

时间:2016-11-01 16:06:20

标签: algorithm traversal avl-tree

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

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

•在O(log n)时间内从S中删除元素。

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

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

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

3 个答案:

答案 0 :(得分:0)

您建议的解决方案在O(k)时间内无效。启动有序遍历需要O(log n)时间。即使你在找到一个元素后停止,你仍然需要先到达最左边的叶子。

我可以想到两个解决方案:

  1. 使用skip-list,它有O(log n)插入和删除,并且基础列表已排序。但是,插入和删除的时间复杂度是平均而非最坏情况。

  2. 使用修改后的AVL-tree,保留指向最左侧节点的专用指针,并在插入和删除时更新它。节点也必须有指向其父节点的指针,以便您可以从最左侧节点开始进行有序遍历。或使用threaded tree

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

我决定在根节点存储和更新最左边的节点指针,并指向每个节点的前任和后继节点

因此在每次插入时,插入成本为O(logn),O(logn)+ O(logn)成为前导和后继成本,O(logn)+ O(logn)+ O(logn)= O(logn) )

这些指针也允许在插入O(1)后更新受影响的节点指针以分别前往前导或后继,并在O(1)中更新指针

指向最左边节点的指针意味着在那里行进是O(1)然后遍历后继并在O(k)时间内打印第一个k节点。