二叉树查找最接近且大于键

时间:2017-03-17 13:40:46

标签: algorithm data-structures tree binary-tree

说我有一个平衡的二叉树。我希望在树中搜索一个关键的k。但是,如果二进制树中不存在k,它应该给出下一个最接近k的最大数。

例如,假设我将这些数字[1,5,6,8,10]作为树中的键。如果我搜索' 7'它应该返回8,如果我搜索2它应该返回5等。

在二叉树中需要进行哪些修改才能执行此类搜索?我也想要一个O(log n)解决方案。

1 个答案:

答案 0 :(得分:3)

假设您的意思是“二叉搜索树”而不是“二叉树”,则无需进行任何修改即可在树中找到y> = x的最小元素y。

search(n, x, best_so_far) ::=
    if n == nil { return best_so_far }
    if n.value == x { return x }
    if n.value > x { return search(n.left, x, min(best_so_far, n.value) }
    if n.value < x { return search(n.right, x, best_so_far) }

您可以将此功能称为search(root, x, +infinity)

这个想法是,如果你在节点n处探索左分支,你不需要在n的右边考虑任何东西:n.value大于x,并且右边的所有东西都大于n.value。类似地,如果您正在探索节点n的右侧分支,那么您可以丢弃n左侧的所有内容:n.value小于x,n左侧的所有内容都小于n.value。

代码的运行时以树的高度为界,如果树是平衡的,则为O(log n)。