是否有必要实现具有键和值的BST?

时间:2010-01-12 07:50:24

标签: c# generics binary-tree binary-search

是否有必要使用键和值实现BST?我可以实现一个具有方法调用的BST,如下所示,它将在每个节点上进行比较,看看遍历是应该根据V值到达左节点还是右节点:

public class BST<V>
{
    public void Insert(V value)
    {
        //implementation
    }

    public V Remove(V value)
    {
        //implementation
    }

    //other methods
}

或者,我可以实现BST,使其具有如下方法调用,其中K键是是否遍历左节点或右节点的比较确定:

public class BST<K key, V value>
{
    public void Insert(K key, V value)
    {
        //implementation
    }

    //which of the following would then be the appropriate method signature?
    public V Remove(K key)
    {
        //implementation
    }
    //or?
    public V Remove(V Value)
    {
        //implementation
    }

    //other methods
}

4 个答案:

答案 0 :(得分:2)

不使用密钥,但只有一个值可以。但是,如果执行此操作,树将变为不可变。修改值不再安全,因为它会使树不平衡。您必须通过仅为节点值提供属性getter来强制执行此操作。

答案 1 :(得分:0)

如果它是通用数据结构,我建议使用基于键值的API(因为你事先不知道键和值之间的关系)和TKey上的IComparable约束。如果是特定于用例的实现,其中键也是值(例如,BST用于确定它是否包含指定的键)我建议使用基于密钥的API。

答案 2 :(得分:0)

这取决于你真正需要的是什么。如果需要关联数据结构,则必须实现基于键值的实现。否则,如果您只是将元素放入已排序的集合中,我认为不需要为每个元素都有一个单独的键。只需确保所有元素都实现Comparable,或者您可以传递自定义Comparator实现(如TreeSet / TreeMap中),或任何定义良好的方案,其中包含BST元素的total ordering

答案 3 :(得分:0)

不,需要按键才能运行的数据结构不需要任何其他功能。这取决于您希望如何实现它。大多数时候使用基于键值对的系统是最方便的,但在某些实现中,您可能希望让数据结构的用户指定比较函数,并让每个节点存储一个“值”(用户定义类的实例)。这个类可能包含其他内容的键,但您不必知道类的格式,因为用户指定的比较函数将处理所有内容。

我可以想到使用它的例子是in the Windows kernel