#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <ctime>
#include <cstdlib>
#include <map>
using namespace std;
using std::cout;
string doubleToStr(double var)
{
ostringstream strs;
strs << var;
std::string str = strs.str();
return str;
}
class PodKorzen
{
public:
double value;
PodKorzen *wieksze = NULL;
PodKorzen *mniejsze = NULL;
PodKorzen(double value)
{
this->value = value;
}
void Add(double wart)
{
if (mniejsze == NULL && wieksze == NULL)
mniejsze = new PodKorzen(wart);
else if (mniejsze != NULL && wieksze != NULL)
{
if (wart < mniejsze->value)
{
mniejsze->Add(wart);
}
else
{
wieksze->Add(wart);
}
}
else // mniejsze jest wieksze niema(odwrotnie nie moze byc)
{
if (wart > mniejsze->value)
wieksze = new PodKorzen(wart);
else
{
wieksze = mniejsze;
mniejsze = new PodKorzen(wart);
}
}
}
void show(int zagniezdzenie = 0, int lSpacji = 0, bool czyPierwsze = false)
{
if (!czyPierwsze)
{
for (int i = 0; i < lSpacji; i++)
{
cout << ' ';
}
}
for (int i = 0; i < zagniezdzenie; i++)
{
cout << '-';
}
cout << value;
if (mniejsze != NULL && wieksze != NULL)
{
mniejsze->show(zagniezdzenie + 1, lSpacji + doubleToStr(value).length() + zagniezdzenie, true);
wieksze->show(zagniezdzenie + 1, lSpacji + doubleToStr(value).length() + zagniezdzenie);
}
else if (mniejsze != NULL)
mniejsze->show(zagniezdzenie + 1, lSpacji + doubleToStr(value).length() + zagniezdzenie, true);
else if (wieksze != NULL)
wieksze->show(zagniezdzenie + 1, lSpacji + doubleToStr(value).length() + zagniezdzenie, true);
if (mniejsze == NULL && wieksze == NULL) // aby nie robilo za duzo spacji
cout << endl;
}
bool Search(double wart)
{
if (wart == value)
return true;
else if (mniejsze != NULL && wieksze != NULL)
{
if (wart < mniejsze->value)
return mniejsze->Search(wart);
else
return wieksze->Search(wart);
}
else if (mniejsze != NULL) // mniejsze jest wiekszego nie ma
{
if (wart < mniejsze->value)
{
return mniejsze->Search(wart);
}
else // bo nie ma wiekszego a wartosc jest wieksza
false;
}
else // bo jak nie ma mniejszego to i wiekszego
false;
}
double Minimum()
{
if (mniejsze == NULL)
return value;
return mniejsze->Minimum();
}
double Maximum()
{
if (wieksze == NULL)
return value;
return wieksze->Maximum();
}
};
class Korzen
{
public:
map<int, PodKorzen*> podrzewa;
void Insert(double x)
{
if (podrzewa[(int)x] == NULL)
podrzewa[(int)x] = new PodKorzen(x);
else
podrzewa[(int)x]->Add(x);
}
void Show()
{
for (pair<int, PodKorzen *> p : podrzewa)
{
p.second->show();
}
}
bool Search(double klucz)
{
if (podrzewa[(int)klucz] != NULL)
return podrzewa[(int)klucz]->Search(klucz) == true;
else
return false;
}
double Minimum(double klucz)
{
if (podrzewa[(int)klucz] != NULL)
return podrzewa[(int)klucz]->Minimum();
// else error podano zly klucz
}
double Maximum(double klucz)
{
if (podrzewa[(int)klucz] != NULL)
return podrzewa[(int)klucz]->Maximum();
// else error podano zly klucz
}
};
int main()
{
// POMINĘ CZYSZCZENIE ZASOBÓW BO NIE O TO TU CHODZI I TYLKO ZAŚMIECAĆ KOD BĘDZIE
srand(time(NULL));
Korzen k;
k.Insert(1.5);
k.Insert(1.3);
k.Insert(1.6);
k.Insert(3.5);
k.Insert(3.7);
k.Insert(4.5);
k.Insert(4.0);
k.Insert(4.99);
k.Insert(7.5);
k.Insert(7.3);
k.Insert(7.8);
k.Insert(7.7);
k.Insert(7.9);
k.Insert(7.6);
k.Insert(9.5);
k.Insert(9.3);
k.Show();
cout << endl;
cout << k.Maximum(7) << endl;
cout << k.Minimum(7) << endl;
// test 3
std::clock_t start = std::clock();
double duration;
Korzen nowy;
for (int i = 10; i <= 50; i++) //insertowanie
{
nowy.Insert(i / 10.0); // 990 insertow
}
nowy.Show();
for (int i = 10; i <= 50; i++) //szukanie, min i max
{
nowy.Search(i / 10.0);
nowy.Maximum(i / 10.0);
nowy.Minimum(i / 10.0);
}
duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
std::cout << "czas: " << duration << '\n';
cin.get();
}
W tym kodzie potzrebuję wybrać fragment ok 16 linii który jest najważniejszy i uzasadnic dlaczego . Niestety wszytko wydaje mi się dosć istotne. Ktoś pomoże w wyborze byłbym bardzo wdzieczny.