2011-01-04 25 views
1

私は、メソッドAdd()でバイナリ検索ツリーをプログラムしました。しかし、それは動作していません。ツリーに番号を追加すると、ルートはまだ空です。どうして?C#バイナリ検索ツリーの問題

EDIT:コードペーストビンに、ここで私はルートが割り当てられることはありませんので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

私はそれはあなたのために固定してしまった、www.stackoverflow.com –

+0

あなたにリチャードをありがとう、それがひどくフォーマットされた理由は何だったの -

私は参照渡しにまで読みましたか?コードタグに貼り付けました。 – poiu

答えて

3

方法なので:

public void PridejNode(Node Actual, int new_value) 

は、実際の値を変更する場合があります、このパラメータは参照渡しする必要があります

public void PridejNode(ref Node Actual, int new_value) 

EDITを、私は私の答えを提起しているので、メソッド名はPridejからAdd ...に変更されました。同じ基本的なアイデアです。それはチェコですか?

+0

はい、私はすぐに名前を変更しましたが、それを終えるのを忘れました。ごめんなさい。 – poiu

+0

非常にクールです。私は先月プラハにいた。 – abelenky

2

を表示するといくつかの問題をhavigています。

編集:私はabelenkyによって他の答えにクレジットを与えます。あなたはNodeによって参照渡しする必要があります。

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

"this.Root"を "reference"ではなく "value"で渡しています。 "Actual = new Node(new_value)"を実行するPridejnodeの内部では、元々関数に渡された値を持っていた "Actual"というローカル変数を効果的に変更しています。これは、関数から値を戻すことはありませんので、一時的なローカル変更だけが失われます。歓迎Passing Parameters (C#)

関連する問題