Java 在AVL树中查找大于k的第i个最小密钥
我有一个AVL树,想实现一个函数,返回大于输入k的第I个最小键。这是否需要存储每个节点上子树的大小?如果有人能大致介绍一下这个想法,我将非常感激。谢谢。您可以简单地搜索Java 在AVL树中查找大于k的第i个最小密钥,java,algorithm,binary-search-tree,avl-tree,Java,Algorithm,Binary Search Tree,Avl Tree,我有一个AVL树,想实现一个函数,返回大于输入k的第I个最小键。这是否需要存储每个节点上子树的大小?如果有人能大致介绍一下这个想法,我将非常感激。谢谢。您可以简单地搜索键+1,如果它存在,您将获得值,否则您必须跟踪搜索中访问的最后一个键,因为这将是您的答案。avl中的搜索例程与BST中的搜索例程相同。如果允许在每个节点上存储子树的大小,则只需搜索值k,并且在从递归返回的过程中,可以为每个左子节点添加右子节点的大小加上父节点的大小。如果在任何一点,这个总和大于i,你必须进入右子节点,减去右子节点加
键+1
,如果它存在,您将获得值,否则您必须跟踪搜索中访问的最后一个键,因为这将是您的答案。avl中的搜索例程与BST中的搜索例程相同。如果允许在每个节点上存储子树的大小,则只需搜索值k,并且在从递归返回的过程中,可以为每个左子节点添加右子节点的大小加上父节点的大小。如果在任何一点,这个总和大于i,你必须进入右子节点,减去右子节点加1(同样是节点本身),然后移动到左子节点。如果减去整个正确的子对象太多,那么您只需递归地移动到正确的子对象。这需要O(lgn)
另一方面,如果不允许在每个节点上存储子树的大小,则必须搜索值k应位于的位置,然后依次遍历树,计算每个访问的节点。因为顺序访问左节点右节点,所以在从搜索返回的过程中,您将按递增顺序只计算大于k的值。此方法需要O(lg n+i)。是否允许存储每个节点上子树的大小?问题不是关于
i
-th值大于k
,而不是第一个值吗?@Gassa是的,我想我错过了,因为它没有突出显示。然后我认为他还需要子树的大小作为一个属性来确定O(logN)中的值