#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <windows.h>
using namespace std;
bool WIN=false;
class leaf // один узел
{
int info;
struct leaf *vniz, *right;
public:
leaf(int x) // конструктор вместо функции создания узла нового дерева
{
info = x ;
vniz = right = NULL;
cout<<"zapisal-"<<x<<endl;
}
//методы дерева
leaf* f(int x) //функция добавления элементов в дерево
{
int n=x%10;
if(n==info || ( (info==x) && (x==-1) ) )
{
if(x>9 && x!=-1) //если это не последняя цифра числа
{
if(vniz)
vniz->f(x/10);
else
{
vniz=new leaf((x/10)%10);
if(x>100)
vniz->f(x/10);
else
vniz->vniz=new leaf(-1);
}
}
else // если это единственная цифра
{
if(x!=-1)
{
if(vniz)
vniz->f(-1);
else
vniz=new leaf(-1); // создаем указатель-узел, указывающий на конечность набора
}
}
}
else
{
if(right)
right->f(x);
else
{
if(x!=-1)
right=new leaf(x%10);
else
{
right=new leaf(-1);
return this;
}
if(x>9)
right->f(x);
else
right->vniz=new leaf(-1);
}
}
return this ;
};
void fp(int x) //функция проверки наличия такого числа в дереве
{
int n=x%10;
if(n==info)
{
if(x>9)
{
vniz->fp(x/10);
}
else
{
if(n==-1)
WIN=1;
else
vniz->fp(-1);
}
}
else
if(right)
right->fp(x);
else
WIN=false;
}
void fob()// функция прямого обхода дерева
{
cout<<info<<" ";
if(vniz)
vniz->fob();
if(right)
right->fob();
}
void fy() // функция удаления элемента из дерева
{
if(vniz)
vniz->fy();
if(right)
right->fy();
delete this;
}
};
leaf* fr(char *name) //чтение дерева из файла
{
FILE *fff;
leaf* tree=NULL;
int c,n;
if((fff=fopen(name,"rb"))== NULL)
{
cout<<"\n ошибка открытия файла, попробуйте ввести имя снова. \n";
system("PAUSE");
return tree;
}
fseek(fff, 0, SEEK_END );
c=ftell(fff)/(sizeof(int));
rewind(fff); // отмотка файла на начало
for(int i=0; i<c; i++)
{
fread(&n,sizeof(int),1, fff);
cout<<n<<endl;
if(!tree)
tree=new leaf(n%10);
tree->f(n);
}
if(!fclose(fff))
{
cout<<"\n данные успешно добавлены \n";
return tree;
}
}
int main()
{
int n;
bool z=false;
leaf *tree=NULL;
char name[20];
setlocale(LC_ALL, "Russian");
// чтение леса из файла
do
{
cout<<"введите имя файла: "<<endl;
cin>>name;
tree=fr(name);
}
while(!tree);
// вводим проверяемые цифры
cout<<"функция прямого обхода леса:"<<endl;
tree->fob();
cout<<endl;
for(int i=0; i<5; i++)
{
cout<<" введите число, чтобы проверить его наличие в лесу: ";
cin>>n;
tree->fp(n);
if(WIN)
cout<<" есть такое число"<<endl;
else
cout<<" нет такого числа"<<endl;
WIN=false;
}
tree->fy();
return 0;
}