You are on page 1of 11

PROGRAMIRANJE II

A11 – Stabla (1. dio)

dr Dražen Brđanin (bdrazen@etfbl.net)


Goran Banjac (goran.banjac@etfbl.net)
Danijela Banjac (danijela.banjac@etfbl.net)
Aleksandar Keleč (aleksandar.kelec@etfbl.net)

2016.
A11 BINARNA STABLA
Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor binarnog stabla (informacioni sadržaj
treba da bude cijeli broj),
• definisati funkciju koja dodaje lijevog sina zadatom čvoru,
• definisati funkciju koja dodaje desnog sina zadatom čvoru,
• definisati funkciju koja briše zadati čvor iz stabla,
• definisati funkciju koja briše stablo,
• definisati funkciju koja ispisuje sadržaj stabla u preorder redoslijedu obilaska,
• definisati funkciju koja ispisuje sadržaj stabla u inorder redoslijedu obilaska,
• definisati funkciju koja ispisuje sadržaj stabla u postorder redoslijedu obilaska,
• definisati funkciju koja računa i vraća ukupan broj čvorova stabla,
• definisati funkciju koja računa i vraća sumu vrijednosti svih čvorova stabla,
• definisati funkciju koja računa i vraća ukupan broj listova stabla,
• definisati funkciju koja računa i vraća dubinu stabla,
• u glavnom programu ilustrovati rad sa binarnim stablom tj. definisanim funkcijama.

Stabla (1. dio) 2


A11 BINARNA STABLA
#include <stdio.h>
#include <stdlib.h>
typedef struct cvor { int info; struct cvor *roditelj, *lijevi, *desni; } CVOR;

// pomocna funkcija - kreiranje novog cvora


CVOR* novi_cvor(int info) {
CVOR *novi = (CVOR *)malloc(sizeof(CVOR));
novi->roditelj = novi->lijevi = novi->desni = 0;
novi->info = info;
return novi;
}
CVOR* dodaj_lijevi(CVOR *cvor, int info) {
CVOR *novi = novi_cvor(info);
if (cvor->lijevi) { novi->lijevi = cvor->lijevi; novi->lijevi->roditelj = novi; }
cvor->lijevi = novi;
novi->roditelj = cvor;
return novi;
}
CVOR* dodaj_desni(CVOR *cvor, int info) {
CVOR *novi = novi_cvor(info);
if (cvor->desni) { novi->desni = cvor->desni; novi->desni->roditelj = novi; }
cvor->desni = novi;
novi->roditelj = cvor;
return novi;
}
Stabla (1. dio) 3
A11 BINARNA STABLA
void preorder(CVOR *korijen) { int broj_cvorova(CVOR *korijen) {
if (korijen != 0) { if (korijen == 0) return 0;
printf(" %d", korijen->info); return broj_cvorova(korijen->lijevi) + 1 +
preorder(korijen->lijevi); broj_cvorova(korijen->desni);
preorder(korijen->desni); }
} int suma(CVOR *korijen) {
} if (korijen == 0) return 0;
return suma(korijen->lijevi) +
void inorder(CVOR *korijen) { korijen->info +
if (korijen != 0) { suma(korijen->desni);
inorder(korijen->lijevi); }
printf(" %d", korijen->info); int broj_listova(CVOR *korijen) {
inorder(korijen->desni); if (korijen == 0) return 0;
} if (korijen->lijevi == 0 &&
} korijen->desni == 0)
return 1;
void postorder(CVOR *korijen) { return broj_listova(korijen->lijevi) +
if (korijen != 0) { broj_listova(korijen->desni);
postorder(korijen->lijevi); }
postorder(korijen->desni); int dubina(CVOR *korijen) {
printf(" %d", korijen->info); if (korijen == 0) return 0;
} int dl = dubina(korijen->lijevi),
} dd = dubina(korijen->desni);
return 1 + (dl > dd ? dl : dd);
}
Stabla (1. dio) 4
A11 BINARNA STABLA
void brisi_cvor(CVOR **korijen, CVOR *cvor) {
CVOR *roditelj = cvor->roditelj;
if (cvor->desni == 0) {
if (roditelj == 0) *korijen = cvor->lijevi;
else if (roditelj->lijevi == cvor) roditelj->lijevi = cvor->lijevi;
else roditelj->desni = cvor->lijevi;
if (cvor->lijevi) cvor->lijevi->roditelj = roditelj;
free(cvor);
}
else if (cvor->lijevi == 0) {
if (roditelj == 0) *korijen = cvor->desni;
else if (roditelj->lijevi == cvor) roditelj->lijevi = cvor->desni;
else roditelj->desni = cvor->desni;
if (cvor->desni) cvor->desni->roditelj = roditelj;
free(cvor);
}
else {
cvor->info = cvor->lijevi->info;
brisi_cvor(korijen, cvor->lijevi);
}
}
void brisi_stablo(CVOR *korijen) {
if (korijen != 0)
{ brisi_stablo(korijen->lijevi); brisi_stablo(korijen->desni); free(korijen); }
}
Stabla (1. dio) 5
A11 BINARNA STABLA
int main() {
CVOR *korijen = novi_cvor(10), *c1, *c2, *c3, *c4, *c5;
c1 = dodaj_lijevi(korijen, 5); c3 = dodaj_lijevi(c1, 3); c2 = dodaj_desni(c1, 11);
dodaj_lijevi(c2, 8); c4 = dodaj_desni(c1, 4); c5 = c1 = dodaj_desni(korijen, 6);
dodaj_lijevi(c1, 7); c2 = dodaj_desni(c1, 12); dodaj_desni(c1, 2);
dodaj_lijevi(c2, 1); dodaj_desni(c2, 9);

printf("Stablo (preorder):"); preorder(korijen);


printf("\nStablo (inorder):"); inorder(korijen);
printf("\nStablo (postorder): "); postorder(korijen);
printf("\nBroj cvorova: %d", broj_cvorova(korijen));
printf("\nSuma:
Stablo%d",(preorder):
suma(korijen));
10 5 3 4 11 8 6 7 2 12 1 9
printf("\nBroj listova:
Stablo %d", broj_listova(korijen));
(inorder): 3 5 4 8 11 10 7 6 2 1 12 9
printf("\nDubina stabla: %d", dubina(korijen));
Stablo (postorder): 3 8 11 4 5 7 1 9 12 2 6 10
printf("\nStablo (inorder nakon brisanja %d):", c3->info);
Broj cvorova:
brisi_cvor(&korijen, 12
c3); inorder(korijen);
Suma: (inorder
printf("\nStablo 78 nakon brisanja %d):", c4->info);
Broj listova:
brisi_cvor(&korijen, 5
c4); inorder(korijen);
Dubina
printf("\nStablo stabla:
(inorder 5 brisanja %d):", c5->info);
nakon
brisi_cvor(&korijen, c5); inorder(korijen);
Stablo (inorder nakon brisanja 3): 5 4 8 11 10 7 6 2 1 12 9
printf("\nStablo (inorder nakon
Stablo (inorder nakon brisanja %d):",4):
brisanja korijen->info);
5 8 11 10 7 6 2 1 12 9
brisi_cvor(&korijen, korijen); inorder(korijen);
Stablo (inorder nakon brisanja 6): 5 8 11 10 7 2 1 12 9
brisi_stablo(korijen);
return 0; Stablo (inorder nakon brisanja 10): 8 11 5 7 2 1 12 9
}
Stabla (1. dio) 6
A11 BINARNA STABLA
Napisati program u kojem treba:
• definisati tip CVOR kojim se reprezentuje čvor binarnog stabla (informacioni sadržaj
treba da bude cijeli broj),
• definisati funkciju koja ispisuje sadržaj stabla u preorder redoslijedu obilaska (iterativna
realizacija),
• definisati funkciju koja ispisuje sadržaj stabla u inorder redoslijedu obilaska (iterativna
realizacija),
• definisati funkciju koja kreira kopiju stabla,
• u glavnom programu ilustrovati rad sa definisanim funkcijama.

Stabla (1. dio) 7


A11 BINARNA STABLA
#include <stdio.h>
#include <stdlib.h>

typedef struct c_stablo { int i_stablo; struct c_stablo *lijevi, *desni; } C_STABLO;
typedef struct c_stek { C_STABLO *i_stek; struct c_stek *sljedeci; } C_STEK;

C_STABLO* novi_c_stablo(int i) {
C_STABLO *novi = (C_STABLO *)malloc(sizeof(C_STABLO));
novi->lijevi = novi->desni = 0;
novi->i_stablo = i;
return novi;
}
C_STEK* novi_c_stek(C_STABLO *i) {
C_STEK *novi = (C_STEK *)malloc(sizeof(C_STEK));
novi->sljedeci = 0;
novi->i_stek = i;
return novi; C_STABLO* pop(C_STEK **ptos) {
} if (*ptos == 0) return 0;
C_STEK *stari = *ptos;
void push(C_STEK **ptos, C_STABLO *i) { C_STABLO *i = stari->i_stek;
C_STEK *novi = novi_c_stek(i); *ptos = stari->sljedeci;
novi->sljedeci = *ptos; free(stari);
*ptos = novi; return i;
} }

Stabla (1. dio) 8


A11 BINARNA STABLA
void preorder(C_STABLO *korijen) { void inorder(C_STABLO *korijen) {
if (korijen == 0) return; if (korijen == 0) return;
C_STEK *tos = 0; int kraj = 0;
C_STABLO *sljedeci; C_STEK *tos = 0;
push(&tos, korijen); C_STABLO *sljedeci = korijen;
while (tos) { while (!kraj) {
sljedeci = pop(&tos); while (sljedeci) {
while (sljedeci) { push(&tos, sljedeci);
printf(" %d", sljedeci->i_stablo); sljedeci = sljedeci->lijevi;
if (sljedeci->desni) }
push(&tos, sljedeci->desni); if (tos) {
sljedeci = sljedeci->lijevi; sljedeci = pop(&tos);
} printf(" %d", sljedeci->i_stablo);
} sljedeci = sljedeci->desni;
} }
else
void brisi_stablo(C_STABLO *korijen) { kraj = 1;
if (korijen != 0) { }
brisi_stablo(korijen->lijevi); }
brisi_stablo(korijen->desni);
free(korijen);
}
}

Stabla (1. dio) 9


A11 BINARNA STABLA
C_STABLO* kopiraj_stablo(C_STABLO *korijen) {
C_STABLO *kopija = 0;
if (korijen) {
kopija = novi_c_stablo(korijen->i_stablo);
kopija->lijevi = kopiraj_stablo(korijen->lijevi);
kopija->desni = kopiraj_stablo(korijen->desni);
}
return kopija;
}
int main() {
C_STABLO *korijen = novi_c_stablo(10), *kopija;
korijen->lijevi = novi_c_stablo(5);
korijen->lijevi->lijevi = novi_c_stablo(1);
korijen->lijevi->desni = novi_c_stablo(8);
korijen->lijevi->desni->lijevi = novi_c_stablo(6);
korijen->lijevi->desni->desni = novi_c_stablo(4);
korijen->desni = novi_c_stablo(3);
korijen->desni->desni = novi_c_stablo(9);
korijen->desni->desni->lijevi = novi_c_stablo(2);
printf("Stablo (preorder):"); preorder(korijen);
Stablo (preorder): 10 5 1 8 6 4 3 9 2
printf("\nStablo (inorder):"); inorder(korijen);
Stablo (inorder):
kopija = kopiraj_stablo(korijen); printf("\nKopija 1 5inorder(kopija);
(inorder):"); 6 8 4 10 3 2 9
Kopija (inorder): 1 5 6 8 4 10 3 2 9
brisi_stablo(korijen); brisi_stablo(kopija);
return 0;
}
Stabla (1. dio) 10
A11 ZADACI ZA VJEŽBU
1. U prvi zadatak sa prezentacije dodati funkciju koja omogućava pretragu binarnog
stabla, pa u glavnom programu ilustrovati rad sa implementiranom funkcijom.
2. U prvi zadatak sa prezentacije dodati funkciju koja računa i vraća sumu vrijednosti
svih listova, pa u glavnom programu ilustrovati rad sa implementiranom funkcijom.
3. U prvi zadatak sa prezentacije dodati funkciju koja računa i vraća ukupan broj lijevih
podstabala, pa u glavnom programu ilustrovati rad sa implementiranom funkcijom.
4. U prvi zadatak sa prezentacije dodati funkciju koja računa i vraća ukupan broj desnih
podstabala, pa u glavnom programu ilustrovati rad sa implementiranom funkcijom.
5. Modifikovati prvi zadatak sa prezentacije tako da informacioni sadržaj čvora binarnog
stabla predstavljaju podaci o studentu. Podaci koji se vode o studentu su: broj
indeksa, prezime, ime i prosječna ocjena.
6. Modifikovati prvi zadatak sa prezentacije tako da je omogućeno da informacioni
sadržaj čvora binarnog stabla bude proizvoljnog tipa.
7. U drugi zadatak sa prezentacije dodati funkciju koja ispisuje sadržaj stabla u postorder
redoslijedu obilaska (iterativna realizacija), pa u glavnom programu ilustrovati rad sa
implementiranom funkcijom.

Stabla (1. dio) 11

You might also like