-
Notifications
You must be signed in to change notification settings - Fork 0
/
stablo.h
125 lines (94 loc) · 4.23 KB
/
stablo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#ifndef STABLO_H
#define STABLO_H
#include <vector>
class Stablo {
public:
struct Cvor {
int vrijednost;
int brojNasljednika; //za indeksiranje (zadatak 3)
Cvor* roditelj;
Cvor* lijevoDijete;
Cvor* desnoDijete;
Cvor* sljedeciInOrder; //za iterator unaprijed (zadatak 1)
Cvor* prethodniInOrder; // za iterator unazad (zadatak 1)
Cvor(int vr): vrijednost(vr), brojNasljednika(0), roditelj(nullptr), lijevoDijete(nullptr), desnoDijete(nullptr), sljedeciInOrder(nullptr), prethodniInOrder(nullptr) {}
void ispisiCvor(Cvor*);
Cvor* getSljedeciInOrder(Cvor* trenutni) { return trenutni->sljedeciInOrder; }
Cvor* getPrethodniInOrder(Cvor* trenutni) { return trenutni->prethodniInOrder; }
//nakon sto dodamo novi cvor, idemo unazad do korijena i povecavamo brojNasljednika za svakog roditelja
//kao kad se rodi novo dijete u porodici
void dodajPoJednogNasljednikaSveDoKorijena();
};
class inOrderIterator {
Cvor* pokazivac;
friend class Stablo;
public:
inOrderIterator(Cvor* pok = nullptr): pokazivac(pok) {}
int getVrijednost() { return pokazivac->vrijednost; }
void pomjeriNaSljedeceg() { pokazivac=pokazivac->sljedeciInOrder; } //nullptr samo na kraju
bool dosaoDoKraja() { return pokazivac==nullptr; }
bool operator!=(const inOrderIterator& drugiIterator) const {
return pokazivac != drugiIterator.pokazivac;
//u it!=stablo.End() znaci sve dok cvor na koji pokazuje it nije nullptr
}
// postfix, nema potrebe za prefix
inOrderIterator operator++(int) {
inOrderIterator stariIterator = *this;
pomjeriNaSljedeceg(); //update trenutnog, vracamo stari
return stariIterator;
}
};
class inOrderReverseIterator {
Cvor* pokazivac;
friend class Stablo;
public:
inOrderReverseIterator(Cvor* pok = nullptr) : pokazivac(pok) {}
int getVrijednost() { return pokazivac->vrijednost; }
void pomjeriNaPrethodnog() { pokazivac = pokazivac->prethodniInOrder; }
bool dosaoDoPocetka() { return pokazivac == nullptr; }
bool operator!=(const inOrderReverseIterator& drugiIterator) const {
return pokazivac != drugiIterator.pokazivac;
}
inOrderReverseIterator operator++(int) {
inOrderReverseIterator stariIterator = *this;
pomjeriNaPrethodnog();
return stariIterator;
}
};
private:
Cvor* korijen;
Cvor* najljevljiCvor; //za Begin(), najmanji cvor po vrijednosti
Cvor* najdesnijiCvor; //za rBegin(), najveci cvor po vrijednosti
void inOrder(Cvor*); //ne treba nuzno za prvi zadatak
void inOrderReverse(Cvor*); //ne treba nuzno za prvi zadatak
void levelOrder(Cvor*); //za ispis i debagiranje
int getVisinaStabla(Cvor*);
//podstablo
void inOrderVektorNapuni(Cvor*, std::vector<int>&) const;
void pripremiZaKMP(const std::vector<int>&, std::vector<int>&) const;
bool traziSaKMP(const std::vector<int>&, const std::vector<int>&) const;
//treci zadatak
int ktiNajveci(int k, Cvor*);
public:
Stablo(): korijen(nullptr), najljevljiCvor(nullptr) {}
int getBrojCvorova() {return 1+korijen->brojNasljednika;}
bool praznoStablo() {return korijen == nullptr;}
Cvor* nadjiCvor(int);
void dodajCvor(int);
void inOrder() { inOrder(korijen); } //ne treba nuzno za prvi zadatak
void inOrderReverse() { inOrderReverse(korijen); } //ne treba nuzno za prvi zadatak
void levelOrder() { levelOrder(korijen); } //za ispis i debagiranje
int getVisinaStabla() { return getVisinaStabla(korijen); }
//prvi zadatak
inOrderIterator Begin() { return najljevljiCvor; }
inOrderIterator End() { return inOrderIterator(nullptr); }
inOrderReverseIterator rBegin() { return najdesnijiCvor; }
inOrderReverseIterator rEnd() { return inOrderReverseIterator(nullptr); }
//drugi zadatak
friend bool bPodskupOdA(const Stablo& A, const Stablo& B);
//podstablo
friend bool bPodstabloOdA(const Stablo& A, const Stablo& B);
//treci zadatak
int operator[](int k) { return ktiNajveci(k, korijen); }
};
#endif // STABLO_H