#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
struct ttree {
int inf;
ttree *left, *right;
};
ttree* addtree(ttree *proot, int inf) {
ttree *nl = new ttree{inf, NULL, NULL};
if (proot == NULL) return nl;
ttree *ps = proot, *pr;
bool b;
while (ps != NULL) {
pr = ps;
b = (inf < ps->inf);
if (b) ps = ps->left;
else ps = ps->right;
}
if (b) pr->left = nl;
else pr->right = nl;
return proot;
}
// Сумма всех ключей
int sumTree(ttree *p) {
if (p == NULL) return 0;
return p->inf + sumTree(p->left) + sumTree(p->right);
}
// Количество узлов
int countNodes(ttree *p) {
if (p == NULL) return 0;
return 1 + countNodes(p->left) + countNodes(p->right);
}
// Поиск узла с ключом, ближайшим к заданному значению
void findClosest(ttree *p, double target, int &closestKey, double &minDiff) {
if (p == NULL) return;
double diff = fabs(p->inf - target);
if (diff < minDiff) {
minDiff = diff;
closestKey = p->inf;
}
findClosest(p->left, target, closestKey, minDiff);
findClosest(p->right, target, closestKey, minDiff);
}
void printTree(ttree *p) {
if (p == NULL) return;
printTree(p->left);
std::cout << p->inf << " ";
printTree(p->right);
}
void deltree(ttree *p) {
if (p == NULL) return;
deltree(p->left);
deltree(p->right);
delete p;
}
int main() {
setlocale(LC_ALL, "Russian");
srand(time(0));
ttree *root = NULL;
std::cout << "Исходные числа: ";
for (int i = 0; i < 10; i++) {
int num = rand() % 100; // 0..99
std::cout << num << " ";
root = addtree(root, num);
}
std::cout << "\n\nДерево (по возрастанию): ";
printTree(root);
// Сумма всех ключей и количество узлов
int sum = sumTree(root);
int count = countNodes(root);
double average = (double)sum / count;
std::cout << "\n\nСумма всех ключей: " << sum;
std::cout << "\nКоличество узлов: " << count;
std::cout << "\nСреднее значение: " << average;
// Поиск ближайшего ключа
int closestKey = root->inf;
double minDiff = fabs(root->inf - average);
findClosest(root, average, closestKey, minDiff);
std::cout << "\nБлижайший ключ к среднему: " << closestKey;
std::cout << "\nРазница: " << minDiff << std::endl;
deltree(root);
return 0;
}