Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Коды основных функций / [Код основных функций] Лаб. 3

.pdf
Скачиваний:
41
Добавлен:
03.08.2020
Размер:
53.16 Кб
Скачать

[Код основных функций] Лабораторная работа №3. Бинарное дерево

//Get the current time.

//This function should be used only for measuring time

//(first call, algorithm, second call; then the difference between the values) double getProcTime() {

#if defined(_WIN32) // If Windows:

FILETIME createTime, exitTime, kernelTime, userTime;

if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime) != -1)

return (ULARGE_INTEGER { {userTime.dwLowDateTime, userTime.dwHighDateTime } }).QuadPart / 10000000.L;

return 0;

#else // If Linux or MacOS:

return double(clock()) / CLOCKS_PER_SEC; #endif

}

//Binary Tree class

class BinTree { int n;

BinTree * p1 = nullptr, * p2 = nullptr; public:

explicit BinTree(int n) : n(n) {

if (n > 1) p1 = new BinTree(n - 1), p2 = new BinTree(n - 1);

}

~BinTree() {

delete p2, delete p1;

}

long long sum_recursive() { long long sum = n;

if (p1) sum += p1->sum_recursive(); if (p2) sum += p2->sum_recursive(); return sum;

}

long long sum_iterative() { std::deque<BinTree *> q; long long sum = n;

if (this->p1) q.emplace_back(this->p1); if (this->p2) q.emplace_back(this->p2); for (; !q.empty(); q.pop_front()) {

auto x = q.front(); sum += x->n;

if (x->p1) q.emplace_back(x->p1); if (x->p2) q.emplace_back(x->p2);

}

return sum;

}

friend std::ostream & operator<< (std::ostream & os, const BinTree & bTree) {

if (bTree.p1) os << *bTree.p1 << ' '; os << bTree.n;

if (bTree.p2) os << ' ' << *bTree.p2; return os;

}

};

Тестируются по времени работы методы «sum_recursive» и «sum_iterative» класса «Бинарное дерево».