cuprins structuri de date și algoritmi (limbajul c) curs 4...

9
Structuri de Date și Algoritmi (limbajul C) Curs 4 – Arbori de date Universitatea “Politehnica” din București Facultatea de Electronică, Telecomunicații și Tehnologia Informației Prof. Bogdan IONESCU 2015-2016 2 Cuprins 4.1. Introducere 4.2. Lucrul cu arbori binari Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 1/51 3 4.1. Introducere Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 2/51 4 Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 3/51 P Enunţ: să se realizeze un program ce permite stocarea și manipularea structurii de fișiere a unui sistem de calcul (PC). > Datele ce sunt păstrate pe termen lung sunt stocate permanent în memoria externă (ex. HDD); informaţie brută 0001010010 1100011010 1111110001 0011110110 0001111111 program: Windows 7 Explorer 5 Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 4/51 P Enunţ: să se realizeze un program ce permite stocarea și manipularea structurii de fișiere a unui sistem de calcul (continuare). computer management Windows XP Pentru a putea accesa informaţia de pe dispozitivele externe de stocare aceasta trebuie indexată sau organizată; Disc-0 Disc-1 C: 29.29GB D: 119.75GB G: 960MB H: 1.95GB Disc-2 6 Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 5/51 P Enunţ: să se realizeze un program ce permite stocarea și manipularea structurii de fișiere a unui sistem de calcul (continuare). informaţia stocată pe fiecare unitate logică (partiţie) este organizată ierarhic: nivelul rădăcină ROOT C: 29.29GB fişiere = colecţii de date stocate unitar şi identificate prin: <nume_fisier>.<extensie> .txt .doc .pdf .bmp .cpp .mpg identificator alfanumeric ~3 litere ce descriu tipul conţinutului; ---- ---- ---- ---- ---- ---- ... ---- ---- ---- .exe .com .bat

Upload: trinhdieu

Post on 29-Aug-2019

239 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

Structuri de Date și Algoritmi(limbajul C)

Curs 4 – Arbori de date

Universitatea “Politehnica” din BucureștiFacultatea de Electronică, Telecomunicații și

Tehnologia Informației

Prof. Bogdan IONESCU

2015-20162

Cuprins

4.1. Introducere

4.2. Lucrul cu arbori binari

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 1/51

3

4.1. Introducere

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 2/514

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 3/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (PC).

> Datele ce sunt păstrate pe termen lung sunt stocate

permanent în memoria externă (ex. HDD);

informaţie brută

0001010010

1100011010

1111110001

0011110110

0001111111

program: Windows 7 Explorer

5

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 4/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

computer management Windows XP

⇒ Pentru a putea accesa informaţia de pe dispozitivele externe

de stocare aceasta trebuie indexată sau organizată;

Disc-0

Disc-1

C:29.29GB

D:119.75GB

G:960MB

H:1.95GB

Disc-2

6

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 5/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

⇒ informaţia stocată pe fiecare unitate logică (partiţie) este

organizată ierarhic:

nivelul rădăcinăROOT

C:29.29GB

fişiere = colecţii de date stocate unitar şi identificate prin:

<nume_fisier>.<extensie>

.txt .doc .pdf .bmp .cpp .mpg

identificator alfanumeric

~3 litere ce descriu tipul conţinutului;

------------

------------

...

------------.exe

.com

.bat

Page 2: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

7

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 6/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

directoare = colecţii de fişiere şi/saudirectoare (sunt identificate prin nume)

------------...

...

nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------

------------mydocmydoc

......

nivelul 1 nivelul 2 nivelul N

8

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 7/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

> să analizăm bine problema ...

(1) cum stocăm informația?

> informația de bază este un fișierși informațiile despreacesta:

- text;- valori;- binar;- descriere fișier;etc.

> acestea se repetă pentru valori diferite ale datelor stocatede utilizatori;

------------

9

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 8/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(2) cum este reprezentată informația?

> fișierele sunt înlănțuiteierarhic pe diferite niveluri;

> în ierarhie, există un nod de plecare și există mai multe noduri terminale.

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------mydocmydoc

...

nivelul 2

...

nivelul N

------------

------------

------------windowswindows

------------...

...

nivelul 1

10

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 9/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua?

⇒ E:\windows\explorer.exe

E:\

windows\

explorer.exe

accesare fișier (parcurgere)

11

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 10/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua? stergere fișier

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------mydocmydoc

......

nivelul 1 nivelul 2 nivelul N

------------

12

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 11/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua? stergere director

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

nivelul 1 nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------mydocmydoc

......

nivelul 2 nivelul N

------------

Page 3: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

13

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 12/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua? inserare fișier

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

nivelul 1 nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------mydocmydoc

......

nivelul 2 nivelul N

------------

------------

14

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 13/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua? inserare director

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

nivelul 1 nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------mydocmydoc

...

nivelul 2 nivelul 4

------------

------------

------------

------------myaudiomyaudio

------------

------------

15

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 14/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

(3) ce operații trebuie să putem efectua? căutare fișier

nivelul rădăcinăROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

nivelul 1 nivelul 3

------------

------------myimgmyimg

------------

------------myvideomyvideo

------------

------------mydocmydoc

...

nivelul 2 nivelul 4

------------

------------

------------

------------myaudiomyaudio

------------

------------

16

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 15/51

PEnunţ: să se realizeze un program ce permite

stocarea și manipularea structurii de fișiere a unui

sistem de calcul (continuare).

> cum putem implementao astfel de structură înlimbajul C?nivelul rădăcină

ROOT

C:29.29GB

------------

------------

------------windowswindows

------------...

...

------------

------------

------------mydocmydoc

...

...

nivelul 1 nivelul 2 nivelul N

arbori (“trees”): un ansamblu de structuri de date, dinamice,recursive, relaționate ierarhic pe diferite niveluri;

17

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 16/51

Arbori de date

nod

nod nod nod

nod nod

nod

nodnodnod

nod

nod nod

> arbore = o mulțime finită de noduri relaționate ierarhic;

ultimele noduri = nodurifrunză (“leaf”), nu au succesori;

primul nod = nod rădăcină(“root”), nu are predecesori;

celelalte noduri = formeazăsub-arbori (definit recursiv);

nod

nod nod

nod

...

nod

18

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 17/51

Arbori de date (continuare)

nod

nod nod nod

nod nod

nod nod

nod

nod

nodnodnod

> arbore = o mulțime finită de noduri relaționate ierarhic;

> terminologie:

- un nod rădăcină se numește “nod tată”;

- subarborii nodului tatăse numesc “descendenți”;

- rădăcinile subarborilor unui nod tată se numesc “fii”.

> ierarhie: nodurile se găsesc pe niveluri ierarhice;

0

1

2

3

4 ...

Page 4: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

19

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 18/51

Arbori de date (continuare)

nod

nod nod nod

nod nod

nod

nodnodnod

nod

nod nod

> arbore = o mulțime finită de noduri relaționate ierarhic;

...

20

4.2. Lucrul cu arbori binari

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 19/51

21

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 20/51

Arbori binari> arbore binar = un caz particular de arbore în care fiecarenod rădăcină are maxim doi descendenți;

nod

nod nod

nod nod

nod

nodnod

nod

nod nod

- fiecare nod este astfelrelaționat cu maxim douănoduri: nod stânga șinod dreapta;

22

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 21/51

Arbori binari (continuare)> fiecare nod va stoca două adrese de noduri (stânga/dreapta);

- primul nod (rădăcină) nu este relaționat anterior cu niciun alt nod;date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

23

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 22/51

Arbori binari (continuare)

> fiecare nod va stoca două adrese de noduri (stânga/dreapta);

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

- ultimele noduri(frunze) nu sunt relaționate următor cu niciun alt nod;date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

24

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 23/51

Arbori binari (continuare)

Exemplu definire arbore binar:

struct NOD{int x;struct NOD *NODstanga;struct NOD *NODdreapta;

};

struct NOD *prim;

> Efect: în memorie se alocă o locație pentru pointer-ul prim. Acesta va stoca o adresă la o structură de tip NOD șireprezintă nodul rădăcină al arborelui;

3467100

#*@5!

prim

> pointerii trebuie inițializați.

Page 5: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

25

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 24/51

Arbori binari (continuare)

Exemplu definire arbore binar:

struct NOD{int x;struct NOD *NODstanga;struct NOD *NODdreapta;

};

struct NOD *prim=NULL;

> Efect: în memorie se alocă o locație pentru pointer-ul prim. Acesta va stoca o adresă la o structură de tip NOD șireprezintă nodul rădăcină al arborelui;

3467100

NULL

prim

> pointerii trebuie inițializați.

26

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 25/51

Arbori binari de căutare

> pentru exemplificarea algoritmilor, vom considera maideparte un caz particular de arbori binari, și anume arboribinari de căutare;

> arbore binar de căutare = un arbore binar care stocheazăpe lângă informațiile dorite, o valoare numerică, cheie (n), cu rol de ordonare, astfel:

- pentru oricare nod, descendenții acestuia din subarboreledin stânga au valoarea n < decât a nodului;

- pentru oricare nod, descendenții acestuia din subarboreledin dreapta au valoarea n >= cu a nodului;

> o astfel de implementare a unui arbore permite o parcurgeremai rapidă (eficientă) a valorilor (de ce anume?).

27

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 26/51

Arbori binari de căutare (continuare)

date nod

adr.st. adr.dr.

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

> exemplu:

28

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 27/51

Arbori binari de căutare (continuare)

Exemplu definire arbore binar de căutare:

struct NOD{...

int n; // cheie ordonarestruct NOD *NODstanga;struct NOD *NODdreapta;

};

struct NOD *prim=NULL;

> Efect: în memorie se alocă o locație pentru pointer-ul prim. Acesta va stoca o adresă la o structură de tip NOD șireprezintă nodul rădăcină al arborelui;

3467100

NULL

prim

29

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 28/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

date nod

adr.st. adr.dr.date nod

n=28

adr.st. adr.dr.

nod de inserat

date nod

adr.st. adr.dr.date nod

n=28

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.

date nod

adr.st. adr.dr.date nod

n=28

adr.st. adr.dr.

nodpărinte

30

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 29/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore (continuare)

alocăm memorie pentru nodul nou și inițializăm valorile;

creare legăturăcu nodul nou

dacă arborele este gol, atuncinodul nou devine primul nod;

conform principiului de arbore binar ordonat, trebuie să ne poziționăm pe nodul unde vom lega noul nod;

creare legătură (stânga sau dreapta) cu noul nod;

parcurgere arbore șipoziționare pe

părintele nodului nou

dacă arborele estegol, = nod nou

alocare memorienod nou și init.

determinare valoarede inserat

determinare valoare cheie;

Page 6: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

31

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 30/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore (continuare)

alocare memorienod nou și init.

parcurgere arbore șipoziționare pe

părintele nodului nou

dacă arborele estegol, = nod nou

determinare valoarede inserat

struct NOD* InserareNod(struct NOD *prim, int n){

}

//variabilestruct NOD *nodNou, *nodCurent, *nodParinte;

nodNou=(struct NOD *)malloc(sizeof(struct NOD));

//alocare memorie nod nou

creare legăturăcu nodul nou

//initializare valori nod nounodNou->n=n;nodNou->NODstanga=NULL;nodNou->NODdreapta=NULL;

32

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 31/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore (continuare)

alocare memorienod nou și init.

parcurgere arbore șipoziționare pe

părintele nodului nou

dacă arborele estegol, = nod nou

determinare valoarede inserat

struct NOD* InserareNod(struct NOD *prim, int n){

}

//variabilestruct NOD *nodNou, *nodCurent, *nodParinte;

...

creare legăturăcu nodul nou

//este arborele vid?if (prim==NULL){prim=nodNou;return prim;

}

33

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 32/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore (continuare)

alocare memorienod nou și init.

parcurgere arbore șipoziționare pe

părintele nodului nou

dacă arborele estegol, = nod nou

determinare valoarede inserat

struct NOD* InserareNod(struct NOD *prim, int n){

}

//variabilestruct NOD *nodNou, *nodCurent, *nodParinte;

...

creare legăturăcu nodul nou

//pozitionare in arbore pe parintele nodului nou nodCurent=prim;while (nodCurent!=NULL){nodParinte=nodCurent;if (n<nodCurent->n)nodCurent=nodCurent->NODstanga; //stanga

elsenodCurent=nodCurent->NODdreapta; //dreapta

}

34

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 33/51

Arbori binari de căutare (continuare)

#1 Inserare nod în arbore (continuare)

alocare memorienod nou și init.

parcurgere arbore șipoziționare pe

părintele nodului nou

dacă arborele estegol, = nod nou

determinare valoarede inserat

struct NOD* InserareNod(struct NOD *prim, int n){

}

//variabilestruct NOD *nodNou, *nodCurent, *nodParinte;

...

creare legăturăcu nodul nou

//creare legatura nod parinte cu nodul nou if (n<nodParinte->n)//inserare la stanganodParinte->NODstanga=nodNou;

else//inserare la dreaptanodParinte->NODdreapta=nodNou;

return prim;

35

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 34/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nod

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

> parcurgerea unui arborenu este unic determinată;

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 35/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine = rădăcină, stânga, dreapta

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

> 20, 15, 13, 16, 18, 17, 19, 25, 30, 27, 33.

Page 7: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

37

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 36/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){

}

if (prim!=NULL){

}

dacă prim== NULL

//parcurgere radacinaprintf("%d \n", prim->n);

//parcurgere sub-arbore stangaAfisarePreordine(prim->NODstanga);

//parcurgere sub-arbore dreaptaAfisarePreordine(prim->NODdreapta); re-apelare funcție

pentru prim->NODdreapta

re-apelare funcțiepentru

prim->NODstanga

folosire valoarestocată (n)

38

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 37/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 2

nod 2 != NULL> 15Afis.Preord.(nod 4)Afis.Preord.(nod 5)

nod 2

instanța 3

nod 4 != NULL> 13Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 4

instanța 4

nod st == NULL

nod st

> 20, 15,13,

39

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 38/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 2

nod 2 != NULL> 15Afis.Preord.(nod 4)Afis.Preord.(nod 5)

nod 2

instanța 3

nod 4 != NULL> 13Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 4

instanța 5

nod dr == NULL

nod dr

> 20, 15,13,

40

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 39/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 2

nod 2 != NULL> 15Afis.Preord.(nod 4)Afis.Preord.(nod 5)

nod 2

instanța 6

nod 5 != NULL> 16Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 5

instanța 7

nod st == NULL

nod st

> 20, 15,13, 16,

41

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 40/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 2

nod 2 != NULL> 15Afis.Preord.(nod 4)Afis.Preord.(nod 5)

nod 2

instanța 6

nod 5 != NULL> 16Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 5

instanța 8

nod dr == NULL

nod dr

> 20, 15,13, 16,

42

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 41/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 9

nod 3 != NULL> 25Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 3

instanța 10

nod st == NULL

nod st

> 20, 15,13, 16, 25.

Page 8: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

43

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 42/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: pre-ordine (r-s-d; continuare)

void AfisarePreordine(struct NOD *prim){if (prim!=NULL){ printf("%d \n", prim->n);

AfisarePreordine(prim->NODstanga);AfisarePreordine(prim->NODdreapta); }

}date nod 3

n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

instanța 1

nod 1 != NULL> 20Afis.Preord.(nod 2)Afis.Preord.(nod 3)

nod 1

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

instanța 9

nod 3 != NULL> 25Afis.Preord.(nod st)Afis.Preord.(nod dr)

nod 3

instanța 11

nod dr == NULL

nod dr

> 20, 15,13, 16, 25.

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 43/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: in-ordine = stânga, rădăcină, dreapta

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

> 13, 15, 16, 17, 18, 19, 20, 25, 27, 30, 33.

45

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 44/51

Arbori binari de căutare (continuare)

void AfisareInordine(struct NOD *prim){

}

if (prim!=NULL){

}

dacă prim== NULL

//parcurgere radacinaprintf("%d \n", prim->n);

//parcurgere sub-arbore stangaAfisarePreordine(prim->NODstanga);

//parcurgere sub-arbore dreaptaAfisarePreordine(prim->NODdreapta);

#2 Parcurgere arbore: in-ordine (s-r-d; continuare)

re-apelare funcțiepentru

prim->NODdreapta

re-apelare funcțiepentru

prim->NODstanga

folosire valoarestocată (n)

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 45/51

Arbori binari de căutare (continuare)

#2 Parcurgere arbore: post-ordine = stânga, dreapta, rădăcină

date nodn=25

adr.st. adr.dr.

date nodn=30

adr.st. adr.dr.date nod

n=16

adr.st. adr.dr.

date nodn=15

adr.st. adr.dr.

date nodn=18

adr.st. adr.dr.

date nodn=20

adr.st. adr.dr.

date nodn=17

adr.st. adr.dr.date nod

n=19

adr.st. adr.dr.

date nodn=13

adr.st. adr.dr.

date nodn=27

adr.st. adr.dr.date nod

n=33

adr.st. adr.dr.

> 13, 17, 19, 18, 16, 15, 27, 33, 30, 25, 20.

47

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 46/51

Arbori binari de căutare (continuare)

re-apelare funcțiepentru

prim->NODstanga

void AfisarePostordine(struct NOD *prim){

}

if (prim!=NULL){

}

re-apelare funcțiepentru

prim->NODdreapta

dacă prim== NULL

//parcurgere radacinaprintf("%d \n", prim->n);

folosire valoarestocată (n)

//parcurgere sub-arbore stangaAfisarePreordine(prim->NODstanga);

//parcurgere sub-arbore dreaptaAfisarePreordine(prim->NODdreapta);

#2 Parcurgere arbore: post-ordine (s-d-r; continuare)

48

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 47/51

Arbori binari de căutare (continuare)

#3 Căutarea unui nod

verificăm dacă nodul curent este cel căutat;

dacă nu, dacă valoarea lui n este mai mică, căutăm în sub-arbore stâng;

determinare valoarecheie căutată

determinare valoare cheie, n;

vizitare nodcurent, == n

dacă n < valoare nod curent

re-apelare pentru prim->NODstanga

dacă n >= valoare nod curent

re-apelare pentru prim->NODdreapta

dacă nu, dacă valoarea lui n este mai mare sau egală, căutăm în sub-arbore drept;

Page 9: Cuprins Structuri de Date și Algoritmi (limbajul C) Curs 4 ...campus.pub.ro/lab7/bionescu/index_files/sda/StructuriDateAlgoritmiAnI_C4.pdf · Structuri de Date și Algoritmi (limbajul

49

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 48/51

Arbori binari de căutare (continuare)

struct NOD *CautaNod(struct NOD *tmp, int n){

}

if (tmp!=NULL){if (n==tmp->n)return tmp;

else if (n<tmp->n)//cautare sub-arbore stangreturn CautaNod(tmp->NODstanga, n);

else//cautare sub-arbore dreptreturn CautaNod(tmp->NODdreapta, n);

}elsereturn NULL; //nu a fost gasit

#3 Căutarea unui nod (continuare)

dacă n < valoare nod curent

re-apelare pentru prim->NODstanga

determinare valoarecheie căutată

vizitare nodcurent, == n

dacă n >= valoare nod curent

re-apelare pentru prim->NODdreapta

50

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 49/51

Arbori binari de căutare (continuare)

#4 Ștergere arbore

re-apelare funcție pentru

prim->NODstanga

determinare valoarecheie nod

nod curent != NULL

re-apelare funcție pentru

prim->NODdreapta

date nod 3n=25

adr.st. adr.dr.date nod 2

n=15

adr.st. adr.dr.

date nod 1n=20

adr.st. adr.dr.

date nod 5n=16

adr.st. adr.dr.date nod 4

n=13

adr.st. adr.dr.

> există foarte multe posibilități de abordare a acestei probleme (exemple?)

> propunere: furnizăm nodul de pornireși ștergem doate nodurile următoare;

eliberare memorienod curent

51

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 50/51

Arbori binari de căutare (continuare)#4 Ștergere arbore (continuare)

re-apelare funcție pentru

prim->NODstanga

determinare nodce va fi șters

nod curent != NULL

re-apelare funcție pentru

prim->NODdreapta

eliberare memorienod curent

struct NOD *StergereArbore(struct NOD *tmp){

}

if (tmp!=NULL){//stergere sub-arbore stangaStergereArbore(tmp->NODstanga);

//stergere sub-arbore dreaptaStergereArbore(tmp->NODdreapta);

//eliberare memorie nod curentfree(tmp);

}

return NULL;

52

Curs Structuri de Date și Algoritmi, Prof. Bogdan IONESCU, 2015-2016 51/51

Sfârşitul Cursului 4