Код:
#include "stdafx.h"
#include "windows.h"
#include <cstdlib>
#include <math.h>
#include <iostream>
#include <string>
using namespace std;
#pragma hdrstop
//#pragma argsused
using std::string;
using std::cout;
using std::endl;
using std::cin;
// Структура:
struct tree
{
string eng; //английское слово
string rus; //русский перевод
int count; //количество обращений
tree *left;
tree *right;
};
string temp_eng;
string temp_rus;
int temp_count;
int level = 0;
// Функция создания первого элемента
tree *first(string eng, string rus, int count);
// Функция поиска и добавления элемента
tree *search_insert(tree *root, string eng, string rus, int count);
// Функция показа дерева
void print_tree(tree *p, int level);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int vibor;
tree *root = NULL;
do {
cout << "Нажмите: " << endl;
cout << "1| Добавить слово и его перевод в словарь" << endl;
cout << "2| Выход" << endl;
cout << "3| Вывести дерево на экран" << endl;
cout << "4) Ввести английское слово и искать его перевод" << endl;
cout << "5) Удалить слово из словаря" << endl;
cin >> vibor;
switch (vibor)
{
case 1: {cout << "Введите английское слово: " << endl;
cin >> temp_eng;
cout << "Введите русское слово: " << endl;
cin >> temp_rus;
cout << "Введите значение счетчика: " << endl;
cin >> temp_count;
//создание первого элемента дерева
if (!root) root = first(temp_eng, temp_rus, temp_count);
//создание элементо-потомков дерева
else root = search_insert(root, temp_eng, temp_rus, temp_count);
};
break;
case 2: return 0; break;
case 3: print_tree(root, 0); break;
default: cout << "Нужно нажать клавишу от 1 до 5" << endl;
break;
}
}
while (vibor != 3);
system("pause");
return 0;
}
//---------------------------------------------------------------------------
// Функции программы:
// Функция фрмирования первого элемента дерева:
tree *first(string temp_eng, string temp_rus, int count)
{
tree *pv = new tree;
pv->eng = temp_eng;
pv->rus = temp_rus;
pv->count = temp_count;
pv->left = 0;
pv->right = 0;
return pv;
}
// Функция поиска и добавления элемента в дерево:
tree *search_insert(tree *root, string temp_eng, string temp_rus, int temp_count)
{
tree *pv = root, *prev;
bool found = false;
//поиск по дереву
prev = pv;
while (pv && !found) {
if (temp_eng == pv->eng) found = true;
else if (temp_count < pv->count) pv = pv->left;
else pv = pv->right;
}
if (found) return pv;
//создание нового узла
tree *pnew = new tree;
pnew->eng = temp_eng;
pnew->rus = temp_rus;
pnew->count = temp_count;
pnew->left = 0;
pnew->right = 0;
if (temp_count < prev->count) prev->left = pnew; //присоединение к левому поддереву предка
else prev->right = pnew; //присоединение к правому поддереву предка
return pnew;
}
// Функция показа дерева
void print_tree(tree *p, int level)
{
if (p)
{
print_tree(p->left, level + 1);
for (int i = 0; i<level; i++)
cout << " ";
cout << p->eng;
for (int i = 0; i<level; i++)
cout << " ";
cout << p->rus;
for (int i = 0; i<level; i++)
cout << " ";
cout << p->count;
print_tree(p->right, level + 1);
}
}
Осталось добавить удаление элемента и поиск русского слова по введенному английскому слову.
Код:
#include <iostream>
#include <cstdlib>
struct Tree {
int val;
Tree* left;
Tree* right;
};
Tree* InsertNode(Tree* node, int val);
void PrintNode(std::ostream& _out, const Tree* node);
void ClearNode(Tree* node);
//удаление
Tree* DeleteNode(Tree* node, int val){
if(node == NULL)
return node;
if(val == node->val){
Tree* tmp;
if(node->right == NULL)
tmp = node->left;
else {
Tree* ptr = node->right;
if(ptr->left == NULL){
ptr->left = node->left;
tmp = ptr;
} else {
Tree* pmin = ptr->left;
while(pmin->left != NULL){
ptr = pmin;
pmin = ptr->left;
}
ptr->left = pmin->right;
pmin->left = node->left;
pmin->right = node->right;
tmp = pmin;
}
}
delete node;
return tmp;
} else if(val < node->val)
node->left = DeleteNode(node->left, val);
else
node->right = DeleteNode(node->right, val);
return node;
}
int main(void){
Tree* tree = NULL;
for(int i = 0; i < 20; ++i)
tree = InsertNode(tree, std::rand() % 10);
PrintNode(std::cout, tree);
std::cout << std::endl;
tree = DeleteNode(tree, 5);
tree = DeleteNode(tree, 2);
tree = DeleteNode(tree, 9);
PrintNode(std::cout, tree);
ClearNode(tree);
return 0;
}
//вставка
Tree* InsertNode(Tree* node, int val){
if(node == NULL){
node = new (std::nothrow) Tree();
if(node != NULL){
node->val = val;
node->left = node->right = NULL;
}
return node;
}
if(val < node->val)
node->left = InsertNode(node->left, val);
else
node->right = InsertNode(node->right, val);
return node;
}
//печать
void PrintNode(std::ostream& _out, const Tree* node){
if(node != NULL){
if(node->left != NULL)
PrintNode(_out, node->left);
_out << node->val << ' ';
if(node->right != NULL)
PrintNode(_out, node->right);
}
}
//удаление всего
void ClearNode(Tree* node){
if(node != NULL){
if(node->left != NULL)
ClearNode(node->left);
if(node->right != NULL)
ClearNode(node->right);
delete node;
}
}
Как этот пример переделать под мой код?