Algorithm 在2个AVL节点之间搜索最大值

Algorithm 在2个AVL节点之间搜索最大值,algorithm,data-structures,time-complexity,avl-tree,Algorithm,Data Structures,Time Complexity,Avl Tree,我有一个AVL树,而每个节点包括: 钥匙 价值观 AVL树按键排序 如果我有两个键,现在我想找到这两个键之间的最大值。 我曾尝试向每个节点添加额外的信息,如左子树中的最大值和右子树中的最大值,但我无法在不“丢失”之间的一些节点的情况下获得正确的算法 复杂度时间:O(logn)最坏情况。此复合树上还需要哪些其他操作,以及需要哪些复杂度界限 如果唯一的限制是在这个查找一系列键(j,k)的最大值操作上,那么就有一个愚蠢的解决方案,在任意长的时间内预先计算所有这些n^2最大值;将固定k的所有值存储在

我有一个
AVL树
,而每个节点包括:

  • 钥匙
  • 价值观
AVL树
键排序

如果我有两个键,现在我想找到这两个键之间的最大值。 我曾尝试向每个节点添加额外的信息,如左子树中的最大值和右子树中的最大值,但我无法在不“丢失”之间的一些节点的情况下获得正确的算法


复杂度时间:O(logn)最坏情况。

此复合树上还需要哪些其他操作,以及需要哪些复杂度界限

如果唯一的限制是在这个查找一系列键(j,k)的最大值操作上,那么就有一个愚蠢的解决方案,在任意长的时间内预先计算所有这些n^2最大值;将固定k的所有值存储在树中节点k的数组中;然后,您的操作将简化为查找。但是,如果您想支持插入或删除,其复杂性将类似于O(n^2)


更现实的选择是存储每个子树的最大值。任意两个节点之间最多有O(log(n))子树,在从根到两个键j和k的过程中,或者在树的正下方,您会遇到所有这些子树,因此这就是O(log(n))。这样,您仍然需要插入O(log(n)),但我认为现在删除可能是O(n),因为要恢复已删除条目的子树的最大值非常复杂。

当然,在O(log n)中插入和删除。删除也将是O(logn):每次删除仅影响已删除顶点的祖先。但它将如何工作?在2个键的过程中,您会遇到许多最大值,这些值可能是较小键或较大键的值,而不仅仅是您感兴趣的键之间的最大值。从根开始。只要j和k在同一子树中,就沿着该子树往下走。在某个点上,j将位于左子树中,k位于右子树中。现在,您开始维护遇到的两个值之间的最大值m。首先设置m=该节点的值。(不是子树的最大值!)然后下降到左子树,直到找到j;每次从节点n向左移动时,设置m=max(m,value(n),max of subtree(right child(n)))。每次你向右走,不要更新m。为了找到k,做对称的事情。有一些简单的情况需要特殊的规则。如果键和值之间没有关系,那么在您的描述中,键和值之间到底意味着什么?树是按键排序的,但值可以是其他任何东西。