1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| #include "stdafx.h"
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
struct Tree //Звено дерева
{
int data; //Значение элемента дерева
Tree *left, *right; //Указатели на новые звенья
};
class NT
{
public:
void show(Tree *&Tree) //Функция обхода
{
cout << "File name? ";
char s[20];
FILE *file;
fopen_s(&file, s, "a"); // открываем файл
if (Tree != NULL) //Пока не встретится пустое звено
{
show(Tree->left); //Рекурсивная функция для вывода левого поддерева
cout << Tree->data << " "; //Отображаем корень дерева
fprintf(file, "%d ", Tree->data); //Добавляем информацию в файл
show(Tree->right); //Рекурсивная функци для вывода правого поддерева
}
fclose(file);
}
void addToTree(int data, Tree *&NTree) //Фукция добавления звена в дерево
{
if (NULL == NTree) //Если дерево пусто, то создаем корень
{
NTree = new Tree; //Выделяем память под звено дерева
NTree->data = data; //Записываем данные в звено
NTree->left = NTree->right = NULL; //Подзвенья инициализируем пустотой во избежание ошибок
}
if (data < NTree->data) //Если нововведенный элемент data меньше чем элемент data из корня дерева, уходим влево
{
if (NTree->left != NULL) addToTree(data, NTree->left); //При помощи рекурсии записываем элемент на свободный участок
else //Если элемент получил свой участок, то
{
NTree->left = new Tree; //Выделяем память левому подзвену
NTree->left->left = NTree->left->right = NULL; //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
NTree->left->data = data; //Записываем в левое подзвено записываемый элемент
}
}
if (data > NTree->data) //Если нововведенный элемент data больше чем элемент data из корня дерева, уходим вправо
{
if (NTree->right != NULL) addToTree(data, NTree->right); //При помощи рекурсии записываем элемент на свободный участок
else //Если элемент получил свой участок, то
{
NTree->right = new Tree; //Выделяем память правому подзвену
NTree->right->left = NTree->right->right = NULL; //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
NTree->right->data = data; //Записываем в правое подзвено записываемый элемент
}
}
}
};
int main()
{
setlocale(LC_ALL, "russian");
Tree *Tree = NULL; //Создаем указатель, тип которого равен типу звена дерева, инициализируем его пустотой
const int size = 13;
NT nt;
int alf[size] = { 4, 9, 19, 95, 1, 8, 20, 12, 92, 69, 57, 27, 0 };
cout << "Обход чисел: " << endl;
for (int i = 0; i<size; i++) { nt.addToTree(alf[i], Tree); }//Добавление элементов в дерево
nt.show(Tree); //Вывод на экран дерева или просто обход дерева
system("pause");
return 0;
} |