【问题标题】:Finding the ith smallest key greater than k in an AVL tree在 AVL 树中找到大于 k 的第 i 个最小键
【发布时间】:2014-06-15 02:10:20
【问题描述】:

我有一个 AVL 树,想要实现一个函数,它返回大于输入 k 的第 i 个最小键。这是否需要在每个节点存储子树的大小?如果有人能给出这个想法的大致轮廓,我将不胜感激。谢谢。

【问题讨论】:

  • 是否允许在每个节点上存储子树的大小?

标签: java algorithm binary-search-tree avl-tree


【解决方案1】:

您可以简单地搜索Key+1(如果存在),然后您将获得值,否则您必须跟踪搜索中访问的最后一个键,因为这将是您的答案。 avl中的搜索例程与BST中的相同。

【讨论】:

  • i-th的值不是大于k,不是第一个吗?
  • @Gassa 是的,我想我错过了,因为它没有突出显示。然后我认为他还需要子树的大小作为属性来确定 O(logN)
【解决方案2】:

如果您被允许在每个节点上存储子树的大小,您可以简单地搜索值 k,并且在从递归返回的路上,对于您获取的每个左孩子,您可以为父节点添加右孩子的大小加一。如果在任何时候这个总和大于 i 你必须进入右孩子并减去右孩子加一(再次为节点本身)并移动到左孩子。如果减去整个右孩子太多,那么你只需递归地移动到右孩子。这需要 O(lg n)。

另一方面,如果不允许在每个节点上存储子树的大小,则必须搜索值 k 应该在的位置,然后从那里开始树的 in-order 遍历计数每个访问的节点。由于 in-order 访问 left-node-right,在您从搜索返回的过程中,您将仅按递增顺序计算大于 k 的值。此方法需要 O(lg n + i)。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多