Drzewo BST

0
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    

    public class Wierzcholek
    {
        public int wartosc;
        public Wierzcholek lewy, prawy;

        public Wierzcholek(int a)
        {
         wartosc =a;
         lewy=null;
         prawy=null;
        }
    }

    public class BST
    {
        public Wierzcholek root;


    public Wierzcholek get_adres(int a,Wierzcholek w)
    {
        

        if (a > w.wartosc && w.prawy == null) return w.prawy;
        if (a < w.wartosc && w.lewy == null) return w.lewy;

        if (a > w.wartosc && w.prawy != null) return get_adres(a, w.prawy);
        if (a < w.wartosc && w.lewy  != null) return get_adres(a, w.lewy);

        return new Wierzcholek(0);   // do tego i tak nie dojdzie, bo powyższe warunki są wystarczające, ale kompilator się czepia...
    }

    public void dodaj(int a)
    {
        if (root == null) { root = new Wierzcholek(a); } else
        {
            Wierzcholek w = this.get_adres(a, root);
            w = new Wierzcholek(a);
        }
        //System.Console.WriteLine(w.wartosc);
    }

    public void wypisz(Wierzcholek w)
    {
        System.Console.WriteLine(w.wartosc);
        
            if (w.lewy  != null)wypisz(w.lewy); 
            if (w.prawy != null)wypisz(w.prawy);

    }
  }
        

    class Program
    {
        static void Main(string[] args)
        {
            BST bb = new BST();

            bb.dodaj(5);
            bb.dodaj(2);
            bb.dodaj(3);
            bb.dodaj(8);
           
            bb.wypisz(bb.root);
            System.Console.Read();
        }
    }
}

Drzewo Binarne BST.
Odpaliłem debuggera i wartości prawy i lewy w obiekcie root nie zmieniają się, wskazują na null, dlaczego tak się dzieje?

0
Wierzcholek w = this.get_adres(a, root);
            w = new Wierzcholek(a);

Jedyne, co robi druga linijka to przypisuje referencję nowoutworzonego obiektu do w (a wynik get_adres leci w kosmos).

Referencje w C# to NIE są wskaźniki.

0

Dzięki, jakoś mnie nakierowałeś.

Generalnie idea wygląda tak

this.get_adres(a, root);

ma mi zwrócić obiekt z referencją na null do którego chcę przypisać referencję na nowo tworzony obiekt. Jak mi podpowiesz jak to zrobić, będę wielce rad i ucieszon!

0

getadres zawsze zwraca nulla. Zmień tą metodę na inną która zwraca obiekt, a potem na tym obiekcie zrób setLewy albo setPrawy.

0

Faktycznie,jest tu kilka błędów, dziękuję za pomoc

0

Pisałem kiedyś dla siebie (w celu nauki) kilkanaście różnych struktur danych, w tym BST.

Jeśli cię to interesuje, daje linka - ale uprzedzam że pisałem dawno, kiedy C++ znałem znacznie mniej niż obecnie więc błędy mogą się kryć wszędzie. Tym niemniej, może Ci pomóc. http://pastebin.com/T9eY3q2M

0
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    

    public class Wierzcholek
    {
        public int wartosc;
        public Wierzcholek lewy, prawy;

        public Wierzcholek(int a)
        {
         wartosc =a;
         lewy=null;
         prawy=null;
        }
    }

    public class BST
    {
        public Wierzcholek root;


    public Wierzcholek get_adres(int a,Wierzcholek w)
    {
        

        if (a > w.wartosc && w.prawy == null) return (w.prawy = new Wierzcholek(a));
        if (a < w.wartosc && w.lewy == null) return (w.lewy   = new Wierzcholek(a));

        if (a > w.wartosc && w.prawy != null) return get_adres(a, w.prawy);
        if (a < w.wartosc && w.lewy  != null) return get_adres(a, w.lewy);

        return new Wierzcholek(0);   // do tego i tak nie dojdzie, bo powyższe warunki są wystarczające, ale kompilator się czepia...
    }

    public void dodaj(int a)
    {
        if (root == null) { root = new Wierzcholek(a); } else
        {

            this.get_adres(a, root);
             
        }
   
    }

    public void wypisz(Wierzcholek w)
    {
        System.Console.WriteLine(w.wartosc);
        
            if (w.lewy  != null)wypisz(w.lewy); 
            if (w.prawy != null)wypisz(w.prawy);

    }
  }
        

    class Program
    {
        static void Main(string[] args)
        {
            BST bb = new BST();

            bb.dodaj(5);
            bb.dodaj(9);
            bb.dodaj(10);
            bb.dodaj(2);
            bb.dodaj(3);
            bb.dodaj(8);
           
            bb.wypisz(bb.root);
            System.Console.Read();
        }
    }
}

Zrobiłem tak i działa, można by to uprościć, ale już mi się nie chce , może komuś się przyda

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