在AVL树中查找大于k的第i个最小键

时间:2014-06-15 02:10:20

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

我有一个AVL树,想要实现一个返回大于输入k的第i个最小键的函数。这是否需要在每个节点存储子树的大小?如果有人能够概括一下这个想法,我会非常感激。感谢。

2 个答案:

答案 0 :(得分:1)

您只需搜索Key+1,如果它存在,那么您将获得其他值,您必须跟踪搜索中访问的最后一个密钥,因为这将是您的答案。 avl中的搜索例程与BST中的搜索例程相同。

答案 1 :(得分:1)

如果允许您在每个节点上存储子树的大小,您只需搜索值 k ,并且在从递归回来的路上,对于您带走的每个左子女,可以为父节点添加正确子项的大小加一。如果此总和大于 i ,则必须进入正确的子项并减去正确的子项加一(再次针对节点本身)并移至左子项。如果减去整个正确的孩子太多,那么你只需递归地移动到正确的孩子。这需要O(lg n)。

另一方面,如果不允许在每个节点上存储子树的大小,则必须搜索值 k 应该位于的位置,并从那里搜索计算每个访问节点的树的按顺序遍历。由于按顺序访问左侧节点右侧,在您从搜索返回的方式中,您将按递增顺序仅计算大于 k 的值。这个方法需要O(lg n + i)。