Загрузка данных


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