是否有一种方法可以让二元搜索树具有对象节点,存储多个值,并且能够将这些值中的一个视为“主”变量,在排序时将用于比较(平衡)树。
示例:
树= Artist
集合
Artist
都是一个节点,其中包含Name
,Age
等属性,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; }
}
}
答案 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>
中的指定成员并对其进行比较。我会高度建议您不要这样做 - 只需将此作为您问题的“答案”; - )
但实际上 - 你的树需要通用才能接受不同类的节点。您的节点类需要/不应该是通用的恕我直言。