C# 二叉搜索树

3

我正在为教授给我的二叉搜索树代码编写测试用例。

public static void Main(string [] args)
{
    //on my prof's code, public class BinSearchTree<T>
    BinSearchTree<int> myTree = new BinSearchTree<int>();

    myTree.Insert(10);
    myTree.Insert(15);
    myTree.Insert(5);
    myTree.Insert(2);
    myTree.Insert(1);

    Console.WriteLine(myTree.ToString());
    Console.ReadKey();
}

代码可以编译通过,但是显示结果有问题。

BinSearchTree`1[System.Int32]

请问有人知道为什么会显示这个结果吗?

以下是我的教授提供的代码:

public class BinSearchTree<T> where T : IComparable<T>
{
private class OurTreeNode<T>
{
    public T Data { get; set; }
    public OurTreeNode<T> Left;
    public OurTreeNode<T> Right;
    public OurTreeNode(T d = default(T), OurTreeNode<T> leftnode = null, OurTreeNode<T> rightnode = null)
    {
        Data = d;
        Left = leftnode;
        Right = rightnode;
    }

    public override string ToString()
    {
        return Data.ToString();
    }
}
//...other methods

//prof's Insert method
public void Insert(T newItem)
{
    mRoot = Insert(newItem, mRoot);
}
private OurTreeNode<T> Insert(T newItem, OurTreeNode<T> pTmp)
{
    if (pTmp == null)
        return new OurTreeNode<T>(newItem, null, null);
    else if (newItem.CompareTo(pTmp.Data) < 0)
        pTmp.Left = Insert(newItem, pTmp.Left);
    else if (newItem.CompareTo(pTmp.Data) > 0)
        pTmp.Right = Insert(newItem, pTmp.Right);
    else
        throw new ApplicationException("...");

    return pTmp;
}
}

我尝试在Insert方法之后添加ToString()方法,但是当我使用foreach时它会给我一个错误。有没有一种方法可以在不创建太多额外方法的情况下显示它?


没有提供Data类。我需要自己创建一个吗? - mrchooo
只需循环遍历所有的TreeNodes,并打印存储值的Data属性即可。 - mybirthname
@安吉拉 - 看,你现在得到了答案。但是,为了理解它们,请准备自己的代码来打印二叉搜索树的节点。 - Am_I_Helpful
@Angela - 另外,你没有展示 BinSearchTree<T> 的 ToString() 方法,而是展示了 OurTreeNode<T> 的 ToString() 方法! - Am_I_Helpful
你需要向我们展示你“尝试添加”的内容以及它给出的错误信息。 - Dour High Arch
3个回答

1

这个类正在使用默认的(Object的)ToString()实现。你有两个选择:

  • 遍历树的元素并自己打印它
  • 请求作者实现/覆盖ToString()方法

0
有人能告诉我为什么它会显示那个吗?
它会显示那个,因为 ToString() 打印类型定义。 对象的 Object.ToString 方法的默认实现返回对象类型的完全限定名称。(来自文档)
例如,以下简短的程序将打印 System.Collections.Generic.List`1[System.Int32],这是 List<int> 的类型。
using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> myTree = new List<int>();
        myTree.Add(10);
        Console.WriteLine(myTree.ToString());
    }
}

这里是如何重写 ToString() 方法以产生有意义输出的基础知识。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        BinSearchTree<int> myTree = new BinSearchTree<int>();
        myTree.Insert(10);
        myTree.Insert(15);
        Console.WriteLine(myTree.ToString());
    }
}

public class BinSearchTree<T> where T : IComparable<T>
{
    private List<T> values = new List<T>();

    // rest of class omitted for clarity

    public void Insert(T val) {
        values.Add(val);
    }

    public override string ToString() {
        var result = string.Empty;
        foreach(var v in values)
        {
            result += v + ", ";
        }

        return result;
    }
}

输出

10, 15,

有没有办法我可以修复它? - mrchooo
@Angela 是的,你需要重写 ToString() 方法。请查看编辑内容。 - Shaun Luttin
我编辑了上面的代码。我的教授已经在他的代码中编写了一个插入方法,我尝试添加一个ToString方法,但是foreach会出错。 - mrchooo

0

由于您已经创建了 BinaryTree 类的对象,并且没有在 BinaryTree 类中重写 ToString() 方法。因此,您没有创建 OurTreeNode 类的对象,并且没有调用其中重写的 ToString() 方法。因此它会给出 BinaryTree 类的默认 ToString() 方法的输出。

BinSearchTree<int> myTree = new BinSearchTree<int>();

您正在调用

Console.WriteLine(myTree.ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接