【问题标题】:How to make Binary Search Tree with Object as node?如何制作以对象为节点的二叉搜索树?
【发布时间】:2025-12-20 04:00:12
【问题描述】:

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

例子:

树 = 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; }
    }


} 

【问题讨论】:

  • 是的,有办法做到这一点。你对它是如何完成的有一个具体的问题吗?你试过什么?
  • 是的,我设法使 BSTree 包含一个值(数据),但无法想出一种方法来添加另一个可以搜索的变量
  • 史蒂夫,我的意思是平衡,对不起,
  • @user2154803 当您将评论发送给某人时,您应该使用他们的用户名(包括 @ 前缀),他们会收到您已回复他们的通知。

标签: c# binary-search-tree icomparable


【解决方案1】:

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

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

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

例如:

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 实现应该是通用的,这样它就可以是 Artists、Cars、Gerbils 或您认为适合的任何其他 Object 的树在 BST 中使用。

但是,如果您确实需要一个泛型,例如MyGenericNode 类,这将允许任何类型的节点,那么是的,您将使其成为泛型,并确保指定的任何类型都是 IComparable 为根据您的代码。但是您的MyGenericNode 无法“知道”要比较&lt;T&gt; 的哪个成员,除非依赖&lt;T&gt;.CompareTo() 的具体实现。

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

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

【讨论】: