二进制搜索树过滤器值范围

时间:2017-10-24 18:55:58

标签: algorithm search binary-search-tree traversal

我有一个由N个元素组成的树(RBT)。让我们想象我有这棵树(N = 7):

           4
    2             6
1       3      5     7

如何过滤某些范围内的值(例如,打印3到6之间的所有值),其性能优于O(N)?

有没有具体的算法?我想象它找到了价值3 [log(N)]的位置,不知何故继续到6 [O(M)]。

1 个答案:

答案 0 :(得分:1)

如果您有Sedgevick算法,4版,请查看BST上第3.2章的结尾。书籍companion也在Java中实现。

基本算法非常简单:对树进行递归顺序遍历。将键放在队列中的左子树(或任何容器)中,然后键入root,然后键入右子树中的所有键。仅添加指定范围内的键,并跳过不能包含范围内键的子树的递归调用。

你可以尝试这个here - 这是一个基本的BST(范围查询在RBT中的工作方式相同),获得的值在3到6之间。

算法本身:

public IEnumerable<T> Keys(T low, T high)
{
    var queue = new Queue<T>();
    Keys(Root, queue, low, high);
    return queue;
}

private void Keys(Node node, Queue<T> queue, T low, T high)
{
    if (node == null)
        return;

    int cmpLow = low.CompareTo(node.Key);
    int cmpHigh = high.CompareTo(node.Key);

    if (cmpLow < 0)
    {
        Keys(node.Left, queue, low, high);
    }
    if (cmpLow <= 0 && cmpHigh >= 0)
    {
        queue.Enqueue(node.Key);
    }    
    if (cmpHigh > 0)
    {
        Keys(node.Right, queue, low, high);
    }
}

复杂性应为O(h + k),其中h为树的高度,k为范围内的值数。 另请查看范围良好的Range Tree datastructre。