Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 04. 01. 2011 18:44 — Editoval poiu (04. 01. 2011 19:26)

poiu
Příspěvky: 29
Reputace:   
 

C# chyba ve vyhledávacím binárním stromě

Ahoj,

kodím si BVS, ale při pokusu o vložení jakékoliv hodnoty do stromu se do ni nic neuloží, strom je stále prázdný. Proč?

using System;

namespace bst
{
    public class Uzel
    {
        public int hodnota;
        public Uzel Pravy = null;
        public Uzel Levy = null;
       
        public Uzel(int hodnota)
        {
            this.hodnota = hodnota;
        }
    }
   
    public class BVS
    {
        public Uzel Koren = null;
       
        public BVS()
        {
        }
       
        public void Pridej(int nova_hodnota)
        {
            if(Najdi(nova_hodnota))
            {
                Console.WriteLine("Zadaná hodnota (" + nova_hodnota + ") se ve stromu už nachází");
            }
            else
            {
                PridejUzel(this.Koren,nova_hodnota);
            }
           
        }
       
        public void PridejUzel(Uzel Aktualni, int nova_hodnota)
        {
                if(Aktualni == null)
                {
                    Aktualni = new Uzel(nova_hodnota);
                }
                else if(nova_hodnota < Aktualni.hodnota)
                {
                    PridejUzel(Aktualni.Levy,nova_hodnota);
                }
                else if(nova_hodnota > Aktualni.hodnota)
                {
                    PridejUzel(Aktualni.Pravy,nova_hodnota);
                }
           
        }
       
        public void Smaz(int ke_smazani)
        {
            if(this.Najdi(ke_smazani))
            {
               
            }
            else
            {
                Console.WriteLine("Zadaná hodnota (" + ke_smazani + ") se ve stromu nenachází");
            }
        }
       
        public bool Najdi(int hledane)
        {
            Uzel Aktualni = this.Koren;
           
            while(Aktualni != null)
            {
                if(hledane < Aktualni.hodnota)
                {
                    Aktualni = Aktualni.Levy;
                }
                else if(hledane > Aktualni.hodnota)
                {
                    Aktualni = Aktualni.Pravy;
                }
                else
                {
                    return true;
                }
            }
            return false;
           
        }
       
        public void Zobraz()
        {
            ZobrazPodstrom(this.Koren,0);
        }
       
        public void ZobrazPodstrom(Uzel VstupniUzel, int hloubka)
        {
            if(VstupniUzel != null)
            {
                for(int i=1; i<=hloubka; i++)
                {
                    Console.Write("\t");
                }
                Console.WriteLine(VstupniUzel.hodnota);
            }
           
            if(VstupniUzel.Levy != null)
            {
                ZobrazPodstrom(VstupniUzel.Levy,hloubka+1);
            }
           
            if(VstupniUzel.Pravy != null)
            {
                ZobrazPodstrom(VstupniUzel.Pravy,hloubka+1);
            }
        }
    }
   
    class Program
    {
        public static void Main(string[] args)
        {
            BVS strom = new BVS();
            Console.WriteLine(strom.Najdi(5));
            strom.Pridej(5);
            Console.WriteLine(strom.Najdi(5));
            Console.WriteLine(strom.Koren.hodnota);
           
           
            //strom.Zobraz();
           
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

Offline

  • (téma jako vyřešené označil(a) poiu)

#2 04. 01. 2011 19:20

Lukee
Administrátor
Místo: Opava
Příspěvky: 1863
Škola: UPOL, Informatika
Pozice: Roznašeč reklamních bannerů
Web
 

Re: C# chyba ve vyhledávacím binárním stromě

↑ poiu:
V metodě Pridej voláš PridejUzel(this.Koren,nova_hodnota); a v metodě PridejUzel při prvním vložení nezměníš hodnotu this.Koren.

Code:

if(Aktualni == null)
{
     Aktualni = new Uzel(nova_hodnota);
}

Tohle změní hodnotu proměnné Aktualni v aktuálním prostředí, tj. v bloku té funkce, nezmění to hodnotu this.Koren. V C# se nepracuje s odkazy, ale s referencemi.


2+2=4

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson