
Коды основных функций / [Код основных функций] Лаб. 3
.pdf
[Код основных функций] Лабораторная работа №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» класса «Бинарное дерево».