Загрузка данных
#include <iostream>
#include <cstring>
using namespace std;
struct ttree {
char inf[100];
ttree *left;
ttree *right;
};
ttree *addtree(ttree *proot, char *inf) {
ttree *nl = new ttree;
strcpy(nl->inf, inf);
nl->left = NULL;
nl->right = NULL;
if (proot == NULL) return nl;
ttree *ps = proot, *pr;
bool b;
while (ps != NULL) {
pr = ps;
b = (strcmp(inf, ps->inf) < 0);
if (b) ps = ps->left;
else ps = ps->right;
}
if (b) pr->left = nl;
else pr->right = nl;
return proot;
}
void wrtree(ttree *p) {
if (p == NULL) return;
wrtree(p->left);
cout << p->inf << " ";
wrtree(p->right);
}
void wrtree_reverse(ttree *p) {
if (p == NULL) return;
wrtree_reverse(p->right);
cout << p->inf << " ";
wrtree_reverse(p->left);
}
void wrtree_desc(ttree *p) {
if (p == NULL) return;
wrtree_desc(p->right);
cout << p->inf << " ";
wrtree_desc(p->left);
}
bool searchtree(ttree *p, char *key, char *inf) {
if (p == NULL) return false;
if (strcmp(p->inf, key) == 0) {
strcpy(inf, p->inf);
return true;
}
if (strcmp(key, p->inf) < 0) return searchtree(p->left, key, inf);
else return searchtree(p->right, key, inf);
}
int count_chars(ttree *p) {
if (p == NULL) return 0;
return strlen(p->inf) + count_chars(p->left) + count_chars(p->right);
}
ttree *delete_node(ttree *proot, char *inf) {
ttree *ps = proot, *pr = proot, *w, *v;
while ((ps != NULL) && (strcmp(ps->inf, inf) != 0)) {
pr = ps;
if (strcmp(inf, ps->inf) < 0) 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;
}
ttree *deltree(ttree *p) {
if (p == NULL) return NULL;
deltree(p->left);
deltree(p->right);
delete p;
return NULL;
}
int main() {
ttree *root = NULL;
char strings[][100] = {"hello", "world", "tree", "binary", "search", "string", "count", "chars", "lab", "work"};
for (int i = 0; i < 10; i++) {
root = addtree(root, strings[i]);
}
cout << "Прямой обход (возрастание): ";
wrtree(root);
cout << endl;
cout << "Обратный обход (убывание): ";
wrtree_desc(root);
cout << endl;
cout << "Обход в порядке возрастания: ";
wrtree(root);
cout << endl;
int total_chars = count_chars(root);
cout << "Количество символов во всех строках дерева: " << total_chars << endl;
char searchKey[100] = "binary";
char foundInf[100];
if (searchtree(root, searchKey, foundInf))
cout << "Найдена строка: " << foundInf << endl;
else
cout << "Строка " << searchKey << " не найдена" << endl;
char deleteKey[100] = "search";
cout << "Удаление узла со строкой: " << deleteKey << endl;
root = delete_node(root, deleteKey);
cout << "Прямой обход после удаления: ";
wrtree(root);
cout << endl;
total_chars = count_chars(root);
cout << "Количество символов после удаления: " << total_chars << endl;
root = deltree(root);
return 0;
}