Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
ARBORI BINARI DE CAUTARE
NOTIUNI INTRODUCTIVE
Definitie. Se numeste graf orientat perechea ordonata G = (X, U), unde X = si U X x X .
Elementele xi X se numesc noduri.
Definitie. Fiind date doua noduri i si j ale unui graf orientat, se spune ca exista un lant de la i la j daca exista o succesiune de arce, indiferent de sensul lor prin care cele doua noduri sunt unite.
#include<iostream.h>
int st[50], dr[50], n, i, v;
void sdv(int nod) void vsd(nod)
}
}
void svd(nod) void citire( )
cin>>st[i];
} cout<<”dr[”<<i<<”]=”;
cin>>dr[i];
} }
void main( )
ARBORI DE CAUTARE
Definitie. Se numeste arbore de cautare un arbore binar ale carui noduri au o cheie de identificare, iar pentru fiecare nod avem proprietatile urmatoare:
Orice cheie asociata unui nod al subarborelui stang este mai mica decat cheia asociata nodului;
Cheile de identificare sunt
distincte.
Consideram ca arborele
binar de cautare este reprezentat in HEAP de o inregistrare cu
urmatoarea structura:
Crearea arborilor de cautare se face aplicand de un numar de ori operatia de inserare. Regula de inserare este urmatoarea. Se compara cheia asociata inregistrarii care se insereaza. Exista 3 posibilitati:
Cheia coincide cu numarul - se renunta la inserarea acelui numar;
Cheia este mai mare decat numarul – se incearca inserarea in subarborele stang;
Cheia este mai mica decat
numarul – se incearca inserarea in subarborele drept.
Informatia se poate lista
utilizand oricare din metodele cunoscute pentru parcurgerea arborilor.
Daca se doreste listarea informatiilor in ordinea strict
crescatoare a cheilor se utilizeaza metoda stang – varf - dreapta
(inordine).
Regula de cautare este urmatoarea:
Daca arborele este nevid, atunci avem posibilitatile urmatoare:
Valoarea coincide cu cheia varfului – valoarea exista in arbore;
Valoarea este mai mica decat cheia asociata varfului – se reia problema pentru subarborele stang;
Valoarea este mai mare decat cheia asociata varfului – se reia problema pentru subarborele drept.
Altfel
Nu exista in arbore o cheie egala cu valoarea data.
STERGEREA
Daca arborele este nevid atunci avem posibilitatile urmatoare:
Valoarea coincide cu cheia varfului – valoarea exista in arbore;
Daca nodul este terminal (subarborii stang si drept sunt vizi), acesta este sters, iar adresa retinuta de parinte pentru el va fi nula.
Daca numai subarborele drept este nevid, nodul este sters, iar parintele lui va retine, in locul adresei lui, adresa subarborelui drept.
Daca subarborele stang este nevid, nodul este sters, iar parintele lui va retine, in locul adresei lui, adresa subarborelui stang.
Daca ambii subarbori sunt nevizi:
Se identifica cel mai din dreapta nod al subarborelui stang;
Cheia nodului astfel identificat va fi memorata de nodul analizat;
Nodul astfel identificat se sterge, iar stergerea se efectueaza ca in cazul in care nodul subordoneaza numai subarborele stang.
Valoarea este mai mica decat cheia asociata varfului – se reia problema pentru subarborele stang;
Valoarea este mai mare decat cheia asociata varfului – se reia problema pentru subarborele drept.
Altfel
Nu exista in arbore o cheie egala cu valoarea data.
Exemple de stergeri
1. In arborele alaturat se sterge nodul 8. Acesta este nod terminal.
2. In arborele alaturat se sterge nodul 9. Acesta subordoneaza un singur subarbore nevid, cel drept.
3.
In arborele alaturat se
sterge nodul 3. Arborele
subordoneaza 2 arbori nevizi. Cel mai din dreapta nod din subarborele
stang are cheia 4. Cheia este
copiata la nodul 3, iar nodul
astfel identificat este sters.
4.
In arborele alaturat se
sterge nodul 7. In subarborele
stang, cel mai din dreapta nod are cheia 4.
Cheia sa va fi retinuta de nodul care avea cheia 7, iar nodul cu cheia 4
este sters.
Subprogramul cmmd efectueaza toate
operatiile corespunzatoare cazului de stergere atunci cand nodul
are ambii subarbori (cel stang si cel drept) nevizi:
APLICATIE
ENUNT
Sa se realizeze o aplicatie care gestioneaza stocul unui magazin. Aplicatia va efectua urmatoarele operatii:
Pentru implementarea informatiilor despre produsele aflate in stocul magazinului se va crea un arbore binar de cautare in care inserarea unui nod se va face astfel incat la parcurgerea in inordine a arborelui sa se poata obtina lista alfabetica a produselor.
REZOLVAREA PROBLEMEI
Aplicatia se va realiza in limbajul de programare C++.
Despre un produs se cunosc urmatoarele informatii:
o Denumirea produsului;
o Unitatea de masura a produsului;
o Pretul produsului;
o TVA-ul produsului;
o Cantitatea de produse;
o Valoarea totala a produsului;
Nodurile arborelui de cautare au urmatoarea structura:
struct arbore ;
unde info este campul care contine informatia din nod (informatii despre un elev), iar as, ad contin adresa subarborelui stang, respectiv adresa subarborelui drept.
Campul info este de tipul definit produs a carui structura este urmatoarea:
struct produs;
unde denumire memoreaza denumirea produsului, um memoreaza unitatea de masura, pret memoreaza pretul produsului, tva memoreaza TVA-ul produsului, cantitate memoreaza cantitatea de produse, iar total memoreaza valoarea totala a produsului.
Inserarea unui nod in arborele de cautare ce are ca radacina pe RAD se face dupa denumirea produsului astfel incat la o parcurgere in inordine a arborelui sa obtinem lista alfabetica a produselor. Acest lucru este realizat de functia inserare care are urmatoarea definitie:
void inserare(arbore *&c,produs e)
Inserarea unui nod in arborele de cautare ce are ca radacina pe RAD1 se face dupa pretul produsului astfel incat la o parcurgere in inordine a arborelui sa obtinem lista produselor in ordinea crescatoare a pretului. Acest lucru este realizat de functia inserare1 care are urmatoarea definitie:
void inserare1(arbore *&c,produs e)
else
Listarea diferitelor rapoarte, adaugarea de noi produse se efectueaza prin prelucrarea celor 2 arbori de cautare.
SURSA PROGRAMULUI C++
#include<fstream.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<ctype.h>
struct produs;
struct arbore;
ofstream fo('MAGAZIN.DAT');
arbore * RAD, *RAD1;
// cheia principala este denumirea produsului (ordine alfabetica)
void inserare(arbore *&c,produs e)
// cheia este pretul produsului (ordine crescatoare)
void inserare1(arbore *&c,produs e)
else
void cmmd(arbore *&c, arbore*&f)
void sterg1(arbore *&c,char den[26], float price)
else
if(c->as==0)
else
if(c->ad==0)
else cmmd(c, c->as);
else
if(strcmp(c->info.denumire,den)<0)
sterg1(c->ad,den,price);
else sterg1(c->as,den,price);
}
else
if(c->info.pret<price)
sterg1(c->ad,den,price);
else
sterg1(c->as,den,price);
else cout<<'Acest produs nu exista in baza de date!!';
void sterg(arbore *&c,char den[26])
else
if(c->as==0)
else
if(c->ad==0)
else cmmd(c, c->as);
else
if(strcmp(c->info.denumire,den)<0)
sterg(c->ad,den);
else sterg(c->as,den);
else cout<<'Acest produs nu exista in baza de date!!';
void modifica1(arbore *&c,char den[26],float price,unsigned int cant)
else
if(strcmp(c->info.denumire,den)<0)
modifica1(c->ad,den,price,cant);
else modifica1(c->as,den,price,cant);
else
if(c->info.pret>price)
modifica1(c->as,den,price,cant);
else modifica1(c->ad,den,price,cant);
else cout<<'Acest produs nu exista in baza de date!!';
void modifica(arbore *&c,char den[26],unsigned int cant)
else
if(strcmp(c->info.denumire,den)<0)
sterg(c->ad,den);
else sterg(c->as,den);
else cout<<'Acest produs nu exista in baza de date!!';
void inordine(arbore *p,unsigned int & nr)
inordine(p->ad,nr);
}
void produse_stoc(arbore *p,unsigned int & nr)
produse_stoc(p->ad,nr);
}
void stoc_zero(arbore *p,unsigned int & nr)
stoc_zero(p->ad,nr);
}
void peste_10000(arbore *p,unsigned int & nr)
peste_10000(p->ad,nr);
}
void total_stoc(arbore *p,unsigned int &nr,float &suma)
void scrie_in_fisier(arbore *p)
void main()
}
fi.close();
clrscr();
textbackground(RED);
textcolor(WHITE);
cout<<endl<<endl<<' ATESTAT 2007'<<endl<<endl<<endl;
cout<<endl<<endl<<' MAGAZIN'<<endl<<endl;
cout<<' CURCAN STEFANITA - clasa a XII-a G'<<endl<<endl<<endl<<endl;
cout<<' Apasa o tasta pentru a continua '<<endl;
getch();
textbackground(BLUE);
textcolor(YELLOW);
clrscr();
cout<<endl<<endl<<endl;
cout<<' I - adaugarea unui produs'<<endl;
cout<<' S - stergerea unui produs'<<endl;
cout<<' V - vanzarea unui produs'<<endl;
cout<<' A - lista alfabetica a produselor'<<endl;
cout<<' P - lista produselor aflate in stoc'<<endl;
cout<<' N - lista produselor cu stocul zero'<<endl;
cout<<' M - lista produselor cu valoare totala peste 10000 lei'<<endl;
cout<<' D - lista produselor in ordinea crescatoare a pretului'<<endl;
cout<<' Q - valoarea totala a stocului'<<endl;
cout<<' X - iesirea din program'<<endl<<endl;
do
case 'I':
case 'S' :
case 'V' :
case 'P' :
case 'N' :
case 'M' :
case 'D' :
case 'Q' :
default : if(optiune!='X') cout<<'Optiune gresita!!!'<<endl;
}
}while(optiune!='X');
clrscr();
cout<<endl<<endl<<' Se actualizeaza informatiile in fisierul MAGAZIN.TXT'<<endl<<endl;
cout<<' Apasa orice tasta pt a inchide aplicatia';
getch();
//se scriu informatiile din arbore in fisierul MAGAZIN.DAT
scrie_in_fisier(RAD);
fo.close();
//se copiaza continutul fisierului MAGAZIN.DAT in fisierul MAGAZIN.TXT
ifstream f('MAGAZIN.DAT');
ofstream g('MAGAZIN.TXT');
char ch[31];
while(!f.eof())
f.close();
g.close();
EXECUTIA PROGRAMULUI
MAGAZIN.TXT
CAIET1
BUC
3.5
0.665
360
1666
CAIET2
BUC
4.67
0.8873
200
1111.459961
CREION1
BUC
1.45
0.2755
300
517.650024
BIBLIOGRAFIE
1. TUDOR SORIN, INFORMATICA – MANUAL PENTRU CLASA A IX-A, Varianta C++, EDITURA L&S INFOMAT, BUCURESTI, 2000.
2. TUDOR SORIN, INFORMATICA – MANUAL PENTRU CLASA A XI-A, Varianta C++, EDITURA L&S INFOMAT, BUCURESTI, 2006.
3. GEORGE DANIEL MATEESCU, PAVEL FLORIN MORARU – Informatica pentru liceu si bacalaureat – Materia de clasa a X-a, Varianta C++ – Editura Donaris, 2002.
Copyright © 2024 - Toate drepturile rezervate