Drzewo binarne z nieznaną ilością węzłów

0

Witam, bardzo proszę kolegów o pomoc. Piszę program rozkładający macierze według pewnego algorytmu. Macierz jest rozkładana w kolejnych krokach aż do najprostszej postaci. W każdym korku z jednek macierzy tworzone są dwie mniejsze. Chciałbym zastosować tutaj strukturę drzewa binarnego. Jednak jest jeden problem - jak stworzyć drzewo nie wiedząc początkowo ile będzie miało węzłów ? Ilość węzłów zależy od wielkości macierzy. Chciałbym to sprawdzać w jakiejś pętli i ogólnie w tej pętli rozkładać tą macierz aż do najprostszej postaci tworząc kolejne węzły drzewa.
Skorzystałem z implementacji węzła

 public class Node
{
   private object data;
   private Node left, right;

   #region Konstruktory
   public Node() : this(null) {}
   public Node(object data) : this(data, null, null) {}
   public Node(object data, Node left, Node right)
   {
      this.data = data;
      this.left = left;
      this.right = right;
   }
   #endregion

   #region Wlasciwosci publiczne
   public object Value
   {
      get
      {
         return data;
      }
      set
      {
         data = value;
      }
   }

   public Node Left
   {
      get
      {
         return left;
      }
      set
      {
         left = value;
      }
   }

   public Node Right
   {
      get
      {
         return right;
      }
      set
      {
         right = value;
      }
   }
   #endregion
}

oraz stworzyłem klasę drzewa binarnego

 public class BinaryTree
{
   private Node root;

   public BinaryTree()
   {
      root = null;
   }

   #region Metody publiczne
   public virtual void Clear()
   {
      root = null;
   }
   #endregion

   #region Wlasciwosci publiczne
   public Node Root
   {
      get
      {
         return root;
      }
      set
      {
         root = value;
      }
   }
   #endregion
}

i wiem teraz, że mogę zacząć tworzyć drzewo binarne np tak :

btree = new BinaryTree();
btree.Root = new Node(1);
btree.Root.Left = new Node(2);
btree.Root.Right = new Node(3);

ale chciałbym to btree.Root. Left.... itd wrzucić do jakiejś pętli która będzie dodawała kolejne węzły np btree.Root.Left.Left dla 4 węzła lewego. Czy ktoś z was orientuje się jak to zrealizować bo ja jakoś nie mam pomysłu. Drzewa mi działają i je zaimplementowałem ale tylko ze znaną liczbą węzłów. Bardzo was proszę o pomoc.

msm - edytowałem posta, <code class="csharp"> zamiast <code class="c#">
msm - ups, jeszcze raz - </code> zamiast <\code>

0

Chłopie, trzeci raz ten sam wątek zakładasz...
-> http://4programmers.net/Forum/Kosz/203198-c_drzewo_binarne_z_nieznana_iloscia_wezlow
-> http://4programmers.net/Forum/Kosz/203207-drzewo_z_nieokreslona_liczba_wezlow
My tu nie wyrzucamy wątków dla zabawy, pierwszy został przeniesiony do algorytmów (nie wyrzucony) bo to pasuje do algorytmów (teraz już w koszu, bo został ten), drugi poleciał za duplikat (bo wtedy pierwszy był w algorytmach).

Tym razem najlepiej opisałeś temat, więc niech zostanie, ale teraz muszę wyrzucić pierwszy wątek z odpowiedzią @Shalom -a.

Liczę że czwarty raz taki sam wątek nie powstanie, pozdrawiam.

0
  1. To:
   public object Value
   {
      get
      {
         return data;
      }
      set
      {
         data = value;
      }
   }
 
   public Node Left
   {
      get
      {
         return left;
      }
      set
      {
         left = value;
      }
   }
 
   public Node Right
   {
      get
      {
         return right;
      }
      set
      {
         right = value;
      }
   }

Jest dokładnie równoważne :

   public object Value { get; set; }
 
   public Node Left {get; set; }
 
   public Node Right {get; set; }

(Chyba że piszesz w C# 2.0 i wcześniejszym)

ale chciałbym to btree.Root. Left.... itd wrzucić do jakiejś pętli która będzie dodawała kolejne węzły np btree.Root.Left.Left dla 4 węzła lewego. Czy ktoś z was orientuje się jak to zrealizować bo ja jakoś nie mam pomysłu.

I teraz problem właściwy, nie rozumiem (i nie tylko ja, jako że nikt nie odpowiada) co w sumie chcesz osiągnąć: Dodawanie kolejnych węzłów lewych:

btree = new BinaryTree();
btree.Root = new Node(1);
Node current = btree.Root();
for(int i = 0; i < 10; i++)
{
    current.Left = new Node();
    current = current.Left;
}

Ale raczej nie o to Ci chodzi, bo nie pytałbyś.
Jeśli chcesz dodawać do jakiegoś węzła, musisz mieć do niego referencję, albo przejść od korzenia do niego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1