Загрузка данных
#include <iostream>
using namespace std;
// Структура узла бинарного дерева поиска (как в лекции)
struct ttree {
int inf;
ttree *left;
ttree *right;
};
/* Функции из лекции (с исправлением опечаток: tree заменено на ttree) */
// Добавление нового элемента
ttree *addtree(ttree *proot, int inf) {
ttree *nl, *pr, *ps;
bool b;
nl = new ttree;
nl->inf = inf;
nl->left = NULL;
nl->right = NULL;
if (proot == NULL) return nl;
ps = proot;
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;
}
// Обход дерева в порядке возрастания (inorder) из лекции
void wrtree(ttree *p) {
if (p == NULL) return;
wrtree(p->left);
cout << p->inf << " ";
wrtree(p->right);
}
// Прямой обход (preorder) – требуется заданием
void preorder(ttree *p) {
if (p == NULL) return;
cout << p->inf << " ";
preorder(p->left);
preorder(p->right);
}
// Обратный обход (postorder) – требуется заданием
void postorder(ttree *p) {
if (p == NULL) return;
postorder(p->left);
postorder(p->right);
cout << p->inf << " ";
}
// Поиск элемента с заданным ключом (исправлено: ttree вместо tree)
void poisktree(ttree *p, int key, bool &b, int &inf) {
if ((p != NULL) && (b != true)) {
if (p->inf != key) {
poisktree(p->left, key, b, inf);
poisktree(p->right, key, b, inf);
} else {
b = true;
inf = p->inf;
}
}
}
// Поиск максимального ключа (исправлено: ttree вместо tree)
int poiskmaxtree(ttree *p) {
while (p->right != NULL) p = p->right;
return p->inf;
}
// Удаление всего дерева (из лекции)
ttree *deltree(ttree *p) {
if (p == NULL) return NULL;
deltree(p->left);
deltree(p->right);
delete p;
return NULL;
}
// Удаление элемента с заданным ключом (из лекции)
ttree *dellist(ttree *proot, int inf) {
ttree *ps = proot, *pr = proot, *w, *v;
while ((ps != NULL) && (ps->inf != inf)) {
pr = ps;
if (inf < ps->inf) ps = ps->left;
else ps = ps->right;
}
if (ps == NULL) return proot;
// Узел без потомков
if ((ps->left == NULL) && (ps->right == NULL)) {
if (ps == pr) {
delete ps;
return NULL;
}
if (pr->left == ps) pr->left = NULL;
else pr->right = NULL;
delete ps;
return proot;
}
// Узел имеет только правого потомка
if (ps->left == NULL) {
if (ps == pr) {
ps = ps->right;
delete pr;
return ps;
}
if (pr->left == ps) pr->left = ps->right;
else pr->right = ps->right;
delete ps;
return proot;
}
// Узел имеет только левого потомка
if (ps->right == NULL) {
if (ps == pr) {
ps = ps->left;
delete pr;
return ps;
}
if (pr->left == ps) pr->left = ps->left;
else pr->right = ps->left;
delete ps;
return proot;
}
// Узел имеет двух потомков
w = ps->left;
if (w->right == NULL) {
w->right = ps->right;
} else {
while (w->right != NULL) {
v = w;
w = w->right;
}
v->right = w->left;
w->left = ps->left;
w->right = ps->right;
}
if (ps == pr) {
delete ps;
return w;
}
if (pr->left == ps) pr->left = w;
else pr->right = w;
delete ps;
return proot;
}
/* Функция для индивидуального задания №2: подсчёт числа листьев */
int count_leaves(ttree *p) {
if (p == NULL) return 0;
if (p->left == NULL && p->right == NULL) return 1;
return count_leaves(p->left) + count_leaves(p->right);
}
/* Построение сбалансированного дерева из отсортированного массива */
ttree* build_balanced(int arr[], int start, int end) {
if (start > end) return NULL;
int mid = (start + end) / 2;
ttree* root = new ttree;
root->inf = arr[mid];
root->left = build_balanced(arr, start, mid - 1);
root->right = build_balanced(arr, mid + 1, end);
return root;
}
int main() {
// Диапазон чисел от -50 до +50
const int N = 101;
int arr[N];
for (int i = 0; i < N; ++i)
arr[i] = -50 + i;
// Создание сбалансированного дерева поиска
ttree *proot = build_balanced(arr, 0, N - 1);
// Вывод обходов, требуемых заданием
cout << "Прямой обход: ";
preorder(proot);
cout << endl;
cout << "Обратный обход: ";
postorder(proot);
cout << endl;
cout << "В порядке возрастания (inorder): ";
wrtree(proot);
cout << endl;
// Индивидуальное задание: подсчёт числа листьев
int leaves = count_leaves(proot);
cout << "Число листьев в дереве: " << leaves << endl;
// Демонстрация работы функций добавления, поиска и удаления
proot = addtree(proot, 100);
cout << "После добавления 100 (inorder): ";
wrtree(proot);
cout << endl;
bool found = false;
int found_inf;
poisktree(proot, 100, found, found_inf);
if (found)
cout << "Элемент 100 найден: " << found_inf << endl;
else
cout << "Элемент 100 не найден" << endl;
found = false;
poisktree(proot, -25, found, found_inf);
if (found)
cout << "Элемент -25 найден: " << found_inf << endl;
else
cout << "Элемент -25 не найден" << endl;
proot = dellist(proot, 100);
cout << "После удаления 100 (inorder): ";
wrtree(proot);
cout << endl;
// Освобождение всей выделенной памяти
proot = deltree(proot);
return 0;
}