2013-07-30 20 views
6

私は先月、C#を学んでいましたが、今はバイナリツリーに苦労しています。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; } 
    } 
} 

私のツリーを呼び出し、任意の他の方法はありますか?または私は間違って何かをしていますか?

+0

を参照してください、あなたはアポストロフィで6'' ' 'リテラルを使用して作成した' char'タイプを変換しています。'char'型は暗黙的に等価な' int'値に変換されており、整数値 "54"は文字 '6'を表します。参照してくださいhttp://msdn.microsoft.com/en-us/library/x9h8tsay%28v=vs.110%29.aspx –

答えて

7

54を表示しているのは、それが何であるのでしょうか(int)'6'です!

あなたはtree.Dataを呼び出しています。この場合、'6'intにキャストされます。


私はあなたが何をしようとして想像あなたが

new Node<char>('6'); 

または

new Node<int>(6); 

More in separate answer, removed for clarity

によってを使用して行うことができ 6を返すのいずれかであります
+1

[続きます..]より良い音: –

+1

@ lazyberezovsky:[代替...] (http://www.youtube.com/watch?v=iwbsx6LvnfY&t=0m51s)さらにスリリング! –

0

私はこれを行う最良の方法は、特定の順序で各ノードの値を表示する簡潔な再帰的ツリートラバーサルアルゴリズムを実装することだと考えています。 C#ライブラリ内にあらかじめ書かれたメソッドがあるので、私はそれを認識していません。運が良かった!

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

6であり、 '6'ではありません。今期待値が印刷されます。あなたのコードは黙っのchar値をキャスト「6」整数に、その結​​果を54

2

を与える(Moved from previous answer for clarity

あなたNode<T>のすべてのデータを返すようにしようとしている場合は、私はついて行くのより良い方法を考えています

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 
それはそうのようなあなたの Node<T>クラスで ToStringメソッドをオーバーライドすることです

これは最善の実装ではありませんが、私はその点を証明していると思います。きれいな実装のために

ちょうど下の答えを明確にするthis answer