305 lines
6.1 KiB
C++
305 lines
6.1 KiB
C++
|
|
#include <iostream>
|
|
#include <queue>
|
|
#include <limits>
|
|
|
|
using namespace std;
|
|
|
|
// razred IskalnoDrevo
|
|
class IskalnoDrevo
|
|
{
|
|
// razred Vozlisce
|
|
class Vozlisce
|
|
{
|
|
double podatek;
|
|
Vozlisce *levo;
|
|
Vozlisce *desno;
|
|
|
|
public:
|
|
|
|
Vozlisce(double podatek)
|
|
{
|
|
this->podatek = podatek;
|
|
this->levo = NULL;
|
|
this->desno = NULL;
|
|
}
|
|
|
|
void vstavi(double podatek)
|
|
{
|
|
if (podatek < this->podatek)
|
|
{
|
|
if (levo == NULL)
|
|
levo = new Vozlisce(podatek);
|
|
else
|
|
levo->vstavi(podatek);
|
|
}
|
|
else
|
|
{
|
|
if (desno == NULL)
|
|
desno = new Vozlisce(podatek);
|
|
else
|
|
desno->vstavi(podatek);
|
|
}
|
|
}
|
|
|
|
int stevilo_vozlisc()
|
|
{
|
|
int stevilo = 1;
|
|
if(desno != NULL)
|
|
stevilo += desno->stevilo_vozlisc();
|
|
|
|
if(levo != NULL)
|
|
stevilo += levo->stevilo_vozlisc();
|
|
|
|
return stevilo;
|
|
}
|
|
|
|
int visina_drevesa(int globina)
|
|
{
|
|
int desnoVisina = 0;
|
|
int levoVisina = 0;
|
|
|
|
if(desno != NULL)
|
|
desnoVisina += desno->visina_drevesa(globina + 1);
|
|
|
|
if(levo != NULL)
|
|
levoVisina += levo->visina_drevesa(globina + 1);
|
|
|
|
if(levoVisina == 0 and desnoVisina == 0)
|
|
return globina;
|
|
else if(levoVisina < desnoVisina)
|
|
return desnoVisina;
|
|
else
|
|
return levoVisina;
|
|
}
|
|
|
|
double najvecji()
|
|
{
|
|
double najvec = this->podatek;
|
|
if(desno != NULL)
|
|
najvec = desno->najvecji();
|
|
|
|
return najvec;
|
|
}
|
|
|
|
double najmanjsi()
|
|
{
|
|
double najmanj = this->podatek;
|
|
|
|
if(levo != NULL)
|
|
najmanj = levo->najmanjsi();
|
|
|
|
return najmanj;
|
|
}
|
|
|
|
void premi_pregled(queue<double> &vrsta)
|
|
{
|
|
vrsta.push(podatek);
|
|
if(levo != NULL)
|
|
levo->premi_pregled(vrsta);
|
|
|
|
if(desno != NULL)
|
|
desno->premi_pregled(vrsta);
|
|
|
|
}
|
|
|
|
void vmesni_pregled(queue<double> &vrsta)
|
|
{
|
|
|
|
if(levo != NULL)
|
|
levo->vmesni_pregled(vrsta);
|
|
|
|
vrsta.push(podatek);
|
|
if(desno != NULL)
|
|
desno->vmesni_pregled(vrsta);
|
|
|
|
}
|
|
|
|
void obratni_pregled(queue<double> &vrsta)
|
|
{
|
|
if(levo != NULL)
|
|
levo->obratni_pregled(vrsta);
|
|
|
|
if(desno != NULL)
|
|
desno->obratni_pregled(vrsta);
|
|
|
|
vrsta.push(podatek);
|
|
}
|
|
|
|
bool iskanje(double stevilo)
|
|
{
|
|
if(stevilo == podatek)
|
|
return true;
|
|
|
|
if (stevilo < podatek)
|
|
{
|
|
if (levo == NULL)
|
|
return false;
|
|
else
|
|
return levo->iskanje(stevilo);
|
|
}
|
|
else
|
|
{
|
|
if (desno == NULL)
|
|
return false;
|
|
else
|
|
return desno->iskanje(stevilo);
|
|
}
|
|
|
|
}
|
|
|
|
double vsota()
|
|
{
|
|
double stevilo = podatek;
|
|
if(desno != NULL)
|
|
stevilo += desno->vsota();
|
|
|
|
if(levo != NULL)
|
|
stevilo += levo->vsota();
|
|
|
|
return stevilo;
|
|
}
|
|
};
|
|
|
|
// nadaljevanje razreda IskalnoDrevo
|
|
Vozlisce *koren;
|
|
|
|
public:
|
|
IskalnoDrevo()
|
|
{
|
|
koren = NULL;
|
|
}
|
|
|
|
void vstavi(double podatek)
|
|
{
|
|
if (koren == NULL)
|
|
koren = new Vozlisce(podatek);
|
|
else
|
|
koren->vstavi(podatek);
|
|
}
|
|
|
|
int stevilo_vozlisc() const
|
|
{
|
|
if (koren == NULL)
|
|
return 0;
|
|
else
|
|
return koren->stevilo_vozlisc();
|
|
}
|
|
|
|
int visina_drevesa() const
|
|
{
|
|
if (koren == NULL)
|
|
return 0;
|
|
else
|
|
return koren->visina_drevesa(1);
|
|
}
|
|
double najvecji() const
|
|
{
|
|
if (koren == NULL)
|
|
return numeric_limits<double>::quiet_NaN();
|
|
return koren->najvecji();
|
|
}
|
|
|
|
double najmanjsi() const
|
|
{
|
|
if (koren == NULL)
|
|
return numeric_limits<double>::quiet_NaN();
|
|
return koren->najmanjsi();
|
|
}
|
|
|
|
queue<double> premi_pregled() const
|
|
{
|
|
queue<double> prefiks;
|
|
if (koren != NULL)
|
|
koren->premi_pregled(prefiks);
|
|
return prefiks;
|
|
}
|
|
|
|
queue<double> vmesni_pregled() const
|
|
{
|
|
queue<double> infiks;
|
|
if (koren != NULL)
|
|
koren->vmesni_pregled(infiks);
|
|
return infiks;
|
|
}
|
|
|
|
queue<double> obratni_pregled() const
|
|
{
|
|
queue<double> postfiks;
|
|
if (koren != NULL)
|
|
koren->obratni_pregled(postfiks);
|
|
return postfiks;
|
|
}
|
|
|
|
bool iskanje(double stevilo) const
|
|
{
|
|
if (koren != NULL)
|
|
return koren->iskanje(stevilo);
|
|
|
|
return false;
|
|
}
|
|
|
|
double vsota() const
|
|
{
|
|
if (koren != NULL)
|
|
return koren->vsota();
|
|
|
|
return numeric_limits<double>::quiet_NaN();
|
|
}
|
|
};
|
|
|
|
int main(int argn, char **args)
|
|
{
|
|
double zaporedje[] = {5,2,8,10,4,6,1,12,-5,-3,-6,-8,7 };
|
|
int dolzina = 13;
|
|
|
|
// ustvarimo nov objekt
|
|
IskalnoDrevo id;
|
|
|
|
// napolnimo drevo
|
|
for (int i = 0; i < dolzina; i++)
|
|
id.vstavi((zaporedje[i]));
|
|
|
|
// pričakovan izhod
|
|
double pricakovan_izhod = 7;
|
|
|
|
// dobljen izhod
|
|
double dobljen_izhod = id.najvecji();
|
|
|
|
// preverimo, če dobimo pravilen izhod
|
|
if (pricakovan_izhod == dobljen_izhod)
|
|
cout << "OK" << endl;
|
|
else
|
|
cout << "Napaka! Pricakovan izhod: " << pricakovan_izhod << ", dobljen izhod: " << dobljen_izhod << endl;
|
|
|
|
|
|
cout << "Stevilo vozlisc: " << id.stevilo_vozlisc() << "\n";
|
|
|
|
cout << "Najdi stevilo 2: " << (id.iskanje(2) ? "true" : "false") << "\n";
|
|
cout << "Najdi stevilo 1: " << (id.iskanje(1) ? "true" : "false") << "\n";
|
|
|
|
cout << id.vsota() << endl;
|
|
|
|
cout << id.visina_drevesa() << endl;
|
|
|
|
queue<double> ha = id.premi_pregled();
|
|
for (int i = 0; i < dolzina; ++i) {
|
|
cout << ha.front() << " ";
|
|
ha.pop();
|
|
}
|
|
cout << "\n";
|
|
ha = id.vmesni_pregled();
|
|
for (int i = 0; i < dolzina; ++i) {
|
|
cout << ha.front() << " ";
|
|
ha.pop();
|
|
}
|
|
cout << "\n";
|
|
ha=id.obratni_pregled();
|
|
for (int i = 0; i < dolzina; ++i) {
|
|
cout << ha.front() << " ";
|
|
ha.pop();
|
|
}
|
|
|
|
return 0;
|
|
}
|