如何使用Object作为节点创建二进制搜索树?

时间:2013-03-19 16:02:55

标签: c# binary-search-tree icomparable

是否有一种方法可以让二元搜索树具有对象节点,存储多个值,并且能够将这些值中的一个视为“主”变量,在排序时将用于比较(平衡)树。

示例:

树= Artist集合

  • 每个Artist都是一个节点,其中包含NameAge等属性,
  • Name是“主”属性,用于在排序/平衡树时进行比较

这是我为节点定义所尝试的内容,但我需要有关上述功能的帮助:

    class Artist<T> where T : IComparable
{
    private T name;
    private T members;

    public Artist<T> Left, Right;

    public Artist(T Name, T Members)
    {
        name = Name;
        members = Members;
        Left = null;
        Right = null;
    }
    public T Name
    {
        set { name = value; }
        get { return name; }
    }
    public T Members
    {
        set { members = value; }
        get { return members; }
    }


} 

1 个答案:

答案 0 :(得分:0)

使您的一个成员值成为排序的“主要”...

您应该直接在IComparable类上实现Artist接口,以便这些节点可以直接比较。这使您可以控制如何比较此类的实例。

为此,您基本上只对您感兴趣的成员进行比较,并将该结果作为对象比较的结果传回。

例如:

class Artist : IComparable
{
    /* Your Artist specific implementation here */
    private string name;
    private int age;
    ...

    /* Implementation of IComparable */
    public int CompareTo(object obj)
    {
        Artist compareToObj = (Artist)obj;

        // Comparison by name.
        return this.name.CompareTo(compareToObj.name);

        // And if you wanted to do the comparison by eg age:
        // return this.age.CompareTo(compareToObj.age);
    }
} 

关于您使用通用节点:

我不确定为什么你让你的Artist类通用 - 我会认为Artist不是通用的,因为你已经知道艺术家的属性等。至少,我在这个问题的背景下,无法看出这有什么用处。您的BinarySearchTree实现 应该是通用的,因此它可以是Artist s,Car s,Gerbil s或其他任意树。您认为适合在BST中使用的其他Object

但是如果你需要一个通用的例如MyGenericNode类,那将允许任何类型的节点,那么是的,你将它变成通用的,并确保指定的类型是可根据您的代码进行IC Comparable。但是,MyGenericNode无法“知道”要比较<T>的成员,除非依赖<T> .CompareTo()的具体实现。

如果你想得到“花哨”(读:凌乱,复杂,矫枉过正......),我你可以编写自己的界面,例如IComparisonMemberSpecifiable,让你通过它是节点比较发生的IComparable成员的名称。除<T>外,IComparable还必须实施新界面。然后,您的MyGenericNode会使用反射“查找”<T>中的指定成员并对其进行比较。我会高度建议您不要这样做 - 只需将此作为您问题的“答案”; - )

但实际上 - 你的树需要通用才能接受不同类的节点。您的节点类需要/不应该是通用的恕我直言。