2013-07-30 23 views
6

Tak więc, uczyłem się C# przez ostatni miesiąc iw tej chwili walczę z Binarnymi Drzewami.C# - Proste drzewo binarne

Moje pytanie brzmi: w jaki sposób mogę wywołać moje drzewo w oknie konsoli? Próbowałem Console.WriteLine(tree.Data); Ale wydaje się, że wpisuję 54 w moim oknie konsoli.

Oto mój kod, jeśli trzeba to sprawdzić:

główny plik

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(); 
} 

klasy Node

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

Czy są jakieś inne metody wywoływania moje drzewo? czy robię coś złego?

+0

prostu do wyjaśnienia odpowiedzi poniżej, są konwersji 'char' typ, który został utworzony za pomocą dosłowne' '6'' z apostrofami.Typ 'char' jest niejawnie konwertowany na równoważną wartość' int', przy czym wartość całkowita "54" reprezentuje znak '6'. Zobacz http://msdn.microsoft.com/en-us/library/x9h8tsay%28v=vs.110%29.aspx –

Odpowiedz

7

Powodem, dla którego po prostu pokazano 54, jest to, co jest tym, czym jest (int)'6'!

Dzwonisz pod numer tree.Data, który zwraca w tym przypadku '6' odlewane do int.


sobie wyobrazić, co próbujesz zrobić, to albo powrócić 6 które można zrobić za pomocą

new Node<char>('6'); 

lub przez

new Node<int>(6); 

(More in separate answer, removed for clarity)

+1

[należy kontynuować ...] brzmi lepiej :) –

+1

@lazyberezovsky: [Alternatywnie ...] (http://www.youtube.com/watch?v=iwbsx6LvnfY&t=0m51s) jeszcze bardziej ekscytujące! –

0

Wierzę, że najlepszym sposobem na zrobienie tego byłoby zaimplementowanie zwięzłego algorytmu rekurencyjnego drzewa trasowania, który wypisuje wartość każdego węzła w określonej kolejności, z jaką je wybierzesz. Jeśli chodzi o wcześniej napisaną metodę w bibliotekach C#, nie jestem tego świadomy. Powodzenia!

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

6, a nie "6". Teraz oczekiwana wartość zostanie wydrukowana. Kod jest cicho rzuca wartość char „6” do liczby całkowitej, co daje Wynik 54.

2

(Moved from previous answer for clarity)

Jeśli starasz się zwrócić wszystkie dane na swój Node<T> myślę lepszy sposób będzie o byłoby zastąpić metodę ToString w swojej klasie Node<T> tak:

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); 
} 

Następnie zadzwonić Console.WriteLine(tree.ToString()); co powoduje następujące:

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

To nie jest najładniejsza implementacja, ale myślę, że to dowodzi.

Dla ładniejszej realizacji patrz this answer