我有一棵2-3棵树,每片叶子都包含:
树按键排序。
我想找到2个键之间的最大值i< j(在域[i,j]中),在最坏的情况下为O(logn)。
我很清楚,我需要在子树"中存储其他信息,例如"最大值。但是,我无法提出精确的算法来遍历所有相关的子树来实现我的目标。
[编辑] 我正在寻找类似于以下主题的内容:
Search max value between 2 AVL nodes
唯一的区别是我对2-3树感兴趣。
答案 0 :(得分:1)
在每个节点中保留maxTreeValue
,表示此子树中的最大值(应在每次修改后更新,从修改后的节点开始自下而上)。
同时开始搜索i,j
,停止搜索路径分割的节点。
从该节点搜索i
。
对于路径中的每个节点,找到每条边的子树之间的最大值,从i
的搜索路径独占中的下一条边到最右边包容性,或j
独占的搜索路径边缘,它们之间的第一个。
然后对j
进行对称,并在它们之间返回最大值。
答案 1 :(得分:0)
无需在树节点中存储额外信息。
每个2-3节点有一个或两个密钥,以及2到3个链接。将变量best_seen
设置为nil
。从树的根开始,考虑以下详尽的情况:
节点中的所有密钥都是<一世。递归到右边。 [如果有任何满足条件的密钥,则必须位于此节点的右侧。]
节点中的所有密钥都是>学家递归到左边。 [如果有任何满足条件的密钥,则必须位于此节点的左侧。]
一个或两个键位于i和j之间;选择i和j之间的较大键作为best_seen
,并递归到best_seen
的右侧。 [如果有任何大于best_seen
的密钥满足条件,则该密钥将位于该密钥的右侧。]
该节点为nil
,返回best_seen
断言:best_seen
永远不会被较小的值替换。 (这是因为我们总是在设置best_seen
后向右递归。)