1

有没有一种方法可以让您拥有一个带有对象节点的二叉搜索树,它存储多个值,并且能够将这些值之一视为“主要”变量,在排序(平衡)树时用于比较.

例子:

树 =Artist集合

  • eachArtist是一个具有诸如 等属性的节点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; }
    }


} 
4

1 回答 1

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类通用 - 我会假设 anArtist不是通用的,因为你知道艺术家的属性等。至少,我看不出这在上下文中有任何用处这个问题。但是,您的BinarySearchTree实现应该是通用的,以便它可以是Artists、Cars、Gerbils 或任何其他Object您认为适合在 BST 中使用的树。

但是,如果您确实需要一个通用的例如MyGenericNode类,它将允许任何类型的节点,那么是的,您将使其成为通用的,并确保根据您的代码指定的任何类型都是 IComparable 。但是除了依赖. MyGenericNode_<T><T>.CompareTo()

如果您想获得“花哨”(阅读:混乱,复杂,矫枉过正......),我认为您可以编写自己的界面,例如,允许您将发生节点比较 IComparisonMemberSpecifiable的成员的名称传递给它。除了. 然后你会使用反射来“找到”其中的指定成员并对其进行比较。我强烈建议您不要这样做 - 只需将其放在这里作为您问题的“答案”;-)IComparable<T>IComparableMyGenericNode<T>

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

于 2013-03-20T00:08:01.560 回答