C# - 简单的二叉树

7

所以,我在过去的一个月里一直在学习C#,目前我正在苦恼于二叉树。

我的问题是,我该如何将我的树呈现在控制台窗口中? 我尝试了Console.WriteLine(tree.Data);,但这似乎会向我的控制台窗口写入54。

如果需要检查,以下是我的代码:

主文件

static void Main(string[] args)
{
    //Creating the Nodes for the Tree
    Node<int> tree = new Node<int>('6');
    tree.Left = new Node<int>('2');
    tree.Right = new Node<int>('5');  

    Console.WriteLine("Binary Tree Display");
    Console.WriteLine(tree.Data);
    Console.ReadLine();
}

节点类

class Node<T> where T : IComparable
{
    private T data;
    public Node<T> Left, Right;

    public Node(T item)
    {
        data = item;
        Left = null;
        Right = null;
    }
    public T Data
    {
        set { data = value; }
        get { return data; }
    }
}

还有其他调用我的Tree的方法吗?还是我做错了什么?

仅为澄清下面的答案,您正在将使用撇号“'6'”创建的char类型进行转换。 char类型被隐式转换为等效的int值,其中整数值“54”表示字符6。请参见http://msdn.microsoft.com/en-us/library/x9h8tsay%28v=vs.110%29.aspx。 - Chris Sinclair
4个回答

8

之所以只显示 54 是因为那是 (int)'6' 所代表的值!

你调用了 tree.Data,在这种情况下返回的是被转换成 int 类型的 '6'


我猜想你想要做的是返回 6,你可以通过使用

new Node<char>('6'); 

或通过
new Node<int>(6);

(更多内容请查看另一个答案,为了清晰起见已删除)

1
[待续...]听起来更好 :) - Sergey Berezovskiy
1
@lazyberezovsky: 或者... 更加惊险刺激! - Chris Sinclair

2
Node<int> tree = new Node<int>(6);

6,而不是'6'。现在将打印期望值。您的代码会将字符值'6'静默转换为整数,从而得到结果54。


2

(为了更加清晰,已从之前的答案中移动)

如果你想要返回你的 Node<T> 所有的数据,我认为一个更好的做法是在你的 Node<T> 类中重写 ToString 方法:

public override string ToString()
{
    var leftString = this.Left != null ? this.Left.ToString() : "null";
    var rightString = this.Right != null ? this.Right.ToString() : "null";
    var dataString = this.Data != null ? this.Data.ToString() : "null";

    leftString = String.Join("\n", leftString.Split('\n').Select(a => "\t" + a));
    rightString = String.Join("\n", rightString.Split('\n').Select(a => "\t" + a));

    return String.Format("\nData: {0}\n"
                        + "Left: {1}\n"
                        + "Right: {2}",
                        dataString, leftString, rightString);
}

然后调用Console.WriteLine(tree.ToString());,结果如下:

Data: 54
Left:   
  Data: 50
  Left:   null
  Right:   null
Right:   
  Data: 53
  Left:   null
  Right:   null

这不是最美观的实现方式,但我认为它证明了这一点。

如果想要更美观的实现方式,请参考这个答案


0

我认为最好的方法是实现一个简洁的递归树遍历算法,按照你选择的特定顺序打印出每个节点的值。至于是否有预先编写好的方法在C#库中可以实现这一点,我不太清楚。祝你好运!


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