2011-01-04 23 views
1

Ich habe einen binären Suchbaum mit der Methode Add() programmiert. Aber es funktioniert nicht. Wenn ich dem Baum eine Zahl hinzufüge, ist root immer noch leer. Warum?C# Binär Suchbaum Problem

EDIT: Code auf Pastebin, hier bin ich einige Probleme mit Havig http://pastebin.com/jvP0WwhR

using System; 

namespace bst 
{ 
    public class Node 
    { 
     public int value; 
     public Node Right = null; 
     public Node Left = null; 

     public Node(int value) 
     { 
      this.value = value; 
     } 
    } 



    public class BST 
    { 
     public Node Root = null; 

     public BST() 
     { 
     } 

     public void Add(int new_value) 
     { 
      if(Search(new_value)) 
      { 
       Console.WriteLine("Zadaná value (" + new_value + ") se ve stromu už nachází"); 
      } 
      else 
      { 
       AddNode(this.Root,new_value); 
      } 

     } 

     public void AddNode(Node Actual, int new_value) 
     { 
       if(Actual == null) 
       { 
        Actual = new Node(new_value); 
       } 
       else if(new_value < Actual.value) 
       { 
        AddNode(Actual.Left,new_value); 
       } 
       else if(new_value > Actual.value) 
       { 
        AddNode(Actual.Right,new_value); 
       } 

     } 


     public bool Search(int hledane) 
     { 
      Node Actual = this.Root; 

      while(Actual != null) 
      { 
       if(hledane < Actual.value) 
       { 
        Actual = Actual.Left; 
       } 
       else if(hledane > Actual.value) 
       { 
        Actual = Actual.Right; 
       } 
       else 
       { 
        return true; 
       } 
      } 
      return false; 

     } 

     public void Display() 
     { 
      DisplayUndertree(this.Root,0); 
     } 

     public void DisplayUndertree(Node EnterNode, int deep) 
     { 
      if(EnterNode != null) 
      { 
       for(int i=1; i<=deep; i++) 
       { 
        Console.Write("\t"); 
       } 
       Console.WriteLine(EnterNode.value); 
      } 

      if(EnterNode.Left != null) 
      { 
       DisplayUndertree(EnterNode.Left,deep+1); 
      } 

      if(EnterNode.Right != null) 
      { 
       DisplayUndertree(EnterNode.Right,deep+1); 
      } 
     } 
    } 

    class Program 
    { 
     public static void Main(string[] args) 
     { 
      BST strom = new BST(); 
      Console.WriteLine(strom.Search(5)); 
      strom.Add(5); 
      Console.WriteLine(strom.Search(5)); 
      Console.WriteLine(strom.Root.value); 


      //strom.Display(); 

      Console.Write("Press any key to continue . . . "); 
      Console.ReadKey(true); 
     } 
    } 
} 
+0

ich es für Sie festgelegt wurde, willkommen in www.stackoverflow.com –

+0

Danke Richard, aber was war der Grund, warum es schlecht formatiert wurde? Ich habe es einfach in das Code-Tag eingefügt. – poiu

Antwort

3

Da das Verfahren:

public void PridejNode(Node Actual, int new_value) 

könnte den Wert der tatsächlichen Änderung dieser Parameter muss als Referenz übergeben werden:

public void PridejNode(ref Node Actual, int new_value) 

EDIT Da ich meine Antwort gestellt, Die Methodennamen wurden von Pridej in Add .... geändert. Dieselbe Grundidee. Ist das Tschechisch?

+0

Ja, es ist, ich habe sie schnell umbenannt, aber ich habe vergessen, das zu beenden. Es tut uns leid. – poiu

+0

Sehr cool. Ich war letzten Monat in Prag. – abelenky

2

Anzeige Weil Wurzel nie zugeordnet ist.

EDIT: Ich werde die andere Antwort von Abelenky Kredit geben. Sie müssen an Node by reference vorbeikommen.

public void PridejNode(ref Node Actual, int new_value) 
0

Sie übergeben "this.Root" durch "Wert" nicht durch "Referenz". Innerhalb von Pridejnode, wo Sie "Actual = new Node (new_value)" machen, ändern Sie effektiv eine lokale Variable namens "Actual", die ursprünglich den Wert hatte, der an die Funktion übergeben wurde. Dadurch wird der Wert nicht von der Funktion zurückgegeben, sodass nur eine temporäre lokale Änderung verloren geht.

ich vorbei Referenz nachlesen würde - Passing Parameters (C#)