Bináris fa keresés?
gondolom tudjátok mi az a bináris fa
nos,ugye a keresés az úgy van, h pl. egy tömbben tároljuk az adatokat. és mindig nézzük, h mikor egyenlő mikor nagyobb kisebb az adott számnál az amit keresünk...
Nos, próbáltam írni egy ilyen programot.
Azonban nem tudom miért de ha 25-t adok meg ( mely a fa első eleme) akkor megy, de ha már elágazik a fa akkor kilép a programból.. miért??
kódom:
#include<stdio.h>
int b = 0; // ezt itt 0 nak adom meg, ezt fogja majd a kereso függvény először használni
int kereso(int szam, int b) // itt van 2 változó, melyek kellenek a függvény hívásához
{
int tomb[] = {25, 20, 30, 15, 22, 28, 32}; // ebben a tömben vannak a kereshető számok
if(szam == tomb[b]) // ha a számunk pont a tömb b. eleme
{
return b+1; // akkor a függvény visszatér b+1- el, b+1 mert a tömb sorszámozása le van maradva
}
else { // ha nem egyenlő
if(szam < tomb[b]) // ha kisebb
{
kereso(szam, b = 2 * b + 1); //akkor ezzel e képlettel indul el megint a függvény a ,b' érték helyett
}
else {
kereso(szam,b = 2 * b + 2); // ha nagyobb akkor ezzel
}
}
}
int main()
{
int a;
scanf("%d",&a); // bekérjük a keresendőt
printf("%d\n",kereso(a, b)); //kiíratjuk a függvényt, a két adott értékkel..
}
Nos először is a bináris fa nem "úgy van, hogy tömbben tároljuk az elemeket", hanem a bináris fa egy lehetséges reprezentációja tömbös. A fent leírt keresési algoritmusod ráadásul bináris keresőfára igaz, nem pedig minden bináris fára. Szerencsére a feltüntetett bináris fád egy ilyen bináris keresőfa tömbös reprezentációja sorfolytonosan, ezért a rekurzív megoldás nagyban hasonlít a tiedhez. Mindazonáltal teljesen felesleges a tömböt minden rekurzív lépésben létrehoznod, illetve nem ellenőrzöd a fa vége feltételt, azaz ha a keresett elemed nincs a fában a programod elszáll. Valami ilyesmi:
int b = 0;
int tomb[] = {25, 20, 30, 15, 22, 28, 32};
int kereso(int szam, int b){
if(szam == tomb[b]){
return b+1;
}else if(szam < tomb[b]){
return tomb[2*b+1]!=NULL ? kereso(szam, b = 2 * b + 1) : -1;
}else{
return tomb[2*b+2]!=NULL ? kereso(szam,b = 2 * b + 2) : -1;
}
}
egyébként köszi szépen! :)
írtad, h elszáll a programom, ha nem található meg az adott elem... de ha pont olyan számot adok meg ami benne van pl.: 20 akkor is elszáll. miért lehet ez?
Ha szabad, megkérdezném hogy ez ("kereso(szam,b = 2 * b + 2);") mi?
Értéket adsz át, vagy függvényt hívsz meg?
Valamint ha egy if statement végén return van, akkor logikusan felesleges az else, hiszen vagy el sem indul az if, vagy kilép a végén a függvényből.
Ez most nekem szólt?
A kereso(szam, 2 * b + 2); az annyi lenne, hogy meghívja magát a függvény. És ügye két szám kell ennek a függvény működéséhez: a szam, és amelyik elemet keresi. A szam az állandó marad, de az elem az változik, ezért más értékkel hívom meg(attól függően, h mennyit kell, hogy mozduljon..)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!