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;
}