Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在AVL树中查找大于k的第i个最小密钥_Java_Algorithm_Binary Search Tree_Avl Tree - Fatal编程技术网

Java 在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,你必须进入右子节点,减去右子节点加

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

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

如果允许在每个节点上存储子树的大小,则只需搜索值k,并且在从递归返回的过程中,可以为每个左子节点添加右子节点的大小加上父节点的大小。如果在任何一点,这个总和大于i,你必须进入右子节点,减去右子节点加1(同样是节点本身),然后移动到左子节点。如果减去整个正确的子对象太多,那么您只需递归地移动到正确的子对象。这需要O(lgn)


另一方面,如果不允许在每个节点上存储子树的大小,则必须搜索值k应位于的位置,然后依次遍历树,计算每个访问的节点。因为顺序访问左节点右节点,所以在从搜索返回的过程中,您将按递增顺序只计算大于k的值。此方法需要O(lg n+i)。

是否允许存储每个节点上子树的大小?问题不是关于
i
-th值大于
k
,而不是第一个值吗?@Gassa是的,我想我错过了,因为它没有突出显示。然后我认为他还需要子树的大小作为一个属性来确定O(logN)中的值