搜索两个2-3树叶之间的最大值

时间:2015-02-15 17:31:24

标签: algorithm data-structures

我有一棵2-3棵树,每片叶子都包含:

  • 关键

树按键排序。

我想找到2个键之间的最大值i< j(在域[i,j]中),在最坏的情况下为O(logn)。

我很清楚,我需要在子树"中存储其他信息,例如"最大值。但是,我无法提出精确的算法来遍历所有相关的子树来实现我的目标。

[编辑] 我正在寻找类似于以下主题的内容:

Search max value between 2 AVL nodes

唯一的区别是我对2-3树感兴趣。

2 个答案:

答案 0 :(得分:1)

在每个节点中保留maxTreeValue,表示此子树中的最大值(应在每次修改后更新,从修改后的节点开始自下而上)。

同时开始搜索i,j,停止搜索路径分割的节点。

从该节点搜索i。 对于路径中的每个节点,找到每条边的子树之间的最大值,从i的搜索路径独占中的下一条边到最右边包容性,或j 独占的搜索路径边缘,它们之间的第一个。

然后对j进行对称,并在它们之间返回最大值。

答案 1 :(得分:0)

无需在树节点中存储额外信息。

每个2-3节点有一个或两个密钥,以及2到3个链接。将变量best_seen设置为nil。从树的根开始,考虑以下详尽的情况:

  1. 节点中的所有密钥都是<一世。递归到右边。 [如果有任何满足条件的密钥,则必须位于此节点的右侧。]

  2. 节点中的所有密钥都是>学家递归到左边。 [如果有任何满足条件的密钥,则必须位于此节点的左侧。]

  3. 一个或两个键位于i和j之间;选择i和j之间的较大键作为best_seen,并递归到best_seen的右侧。 [如果有任何大于best_seen的密钥满足条件,则该密钥将位于该密钥的右侧。]

  4. 该节点为nil,返回best_seen

  5. 断言:best_seen永远不会被较小的值替换。 (这是因为我们总是在设置best_seen后向右递归。)