【发布时间】:2014-06-15 02:10:20
【问题描述】:
我有一个 AVL 树,想要实现一个函数,它返回大于输入 k 的第 i 个最小键。这是否需要在每个节点存储子树的大小?如果有人能给出这个想法的大致轮廓,我将不胜感激。谢谢。
【问题讨论】:
-
是否允许在每个节点上存储子树的大小?
标签: java algorithm binary-search-tree avl-tree
我有一个 AVL 树,想要实现一个函数,它返回大于输入 k 的第 i 个最小键。这是否需要在每个节点存储子树的大小?如果有人能给出这个想法的大致轮廓,我将不胜感激。谢谢。
【问题讨论】:
标签: java algorithm binary-search-tree avl-tree
您可以简单地搜索Key+1(如果存在),然后您将获得值,否则您必须跟踪搜索中访问的最后一个键,因为这将是您的答案。 avl中的搜索例程与BST中的相同。
【讨论】:
i-th的值不是大于k,不是第一个吗?
如果您被允许在每个节点上存储子树的大小,您可以简单地搜索值 k,并且在从递归返回的路上,对于您获取的每个左孩子,您可以为父节点添加右孩子的大小加一。如果在任何时候这个总和大于 i 你必须进入右孩子并减去右孩子加一(再次为节点本身)并移动到左孩子。如果减去整个右孩子太多,那么你只需递归地移动到右孩子。这需要 O(lg n)。
另一方面,如果不允许在每个节点上存储子树的大小,则必须搜索值 k 应该在的位置,然后从那里开始树的 in-order 遍历计数每个访问的节点。由于 in-order 访问 left-node-right,在您从搜索返回的过程中,您将仅按递增顺序计算大于 k 的值。此方法需要 O(lg n + i)。
【讨论】: