2016-07-01 3 views
0

мне нужно сделать дерево префиксов, что пользователь вводит слово и программа отображает дерево префиксов Вывод должен быть: Строка: BananaКак я могу сделать дерево префикса?

па

ана

Нана

Анана

Banana

+0

выход выглядит подозрительно, как массив суффиксов (не суффикс дерева). Я думаю, вам нужно расширить свой вопрос немного больше, код, который у вас сейчас, кажется, отлично работает при создании префиксов. Я думаю, вам нужно будет сделать некоторую работу по написанию кода для создания суффиксов. Если вы застряли, вы должны поделиться тем, что у вас есть. – nlloyd

+0

Программа представляет собой массив суффикса, но я хочу сделать дерево префикса, но я не знаю, как это сделать. –

+0

Знаете ли вы, что такое дерево префиксов? – nlloyd

ответ

0

Это находится в C++

#include <iostream> 
#include <string.h> 
#include <fstream> 

using namespace std; 
int primero; 
struct nodo //Se crea el nodo 
{ 
nodo* ptr[27]; //Las 26 ramas 
int prinodo; 
int ultimon; 
nodo(int s,int e) 
{ 
    for (int i = 0; i < 27; ++i) 
    { 
     ptr[i]=NULL; 
    } 
    prinodo=s; 
    ultimon=e; 
} 
}*raiz=NULL; 


nodo* fun(nodo* hijo,string str,int ind) 
{ 
int s=hijo->prinodo; //Se van creando las ramas 
while(s<=hijo->ultimon&&str.at(s)==str.at(ind)) 
    { 
     s++; 
     ind++; 
    } 
if(s<=hijo->ultimon) // 
{ 
    hijo->ptr[str.at(ind)-'a']=new nodo(ind,primero); 
    if(str.at(s)=='$') 
     hijo->ptr[26]=new nodo(s,hijo->ultimon); 
    else 
     hijo->ptr[str.at(s)-'a']=new nodo(s,hijo->ultimon); 
    hijo->ultimon=s-1; 
    return hijo; 
} 
else 
{ 
    if(hijo->ptr[str.at(ind)-'a']) 
    { 
     hijo->ptr[str.at(ind)-'a']=fun(hijo->ptr[str.at(ind)-'a'],str,ind); 
     return hijo; 
    } 
    else 
    { 
     hijo->ptr[str.at(ind)-'a']=new nodo(ind,primero); 
     return hijo; 
    } 
    } 

    } 




nodo* crea(nodo* raiz,string str,int ind) 
{ 
if(!raiz) 
{ 
    raiz=new nodo(ind,primero); 
    return raiz; 
} 
if(str.at(ind)=='$') 
{ 
    raiz->ptr[26]=new nodo(ind,primero); 
    return raiz; 
} 
if(!raiz->ptr[str.at(ind)-'a']) 
{ 
    raiz->ptr[str.at(ind)-'a']=new nodo(ind,primero); 
    return raiz; 
} 
raiz->ptr[str.at(ind)-'a']=fun(raiz->ptr[str.at(ind)-'a'],str,ind); 
return raiz; 
} 



void Imprime(nodo* raiz,string str) 
    { 
if(!raiz) 
    return; 
if(raiz->prinodo!=-1) 
{ 
    for(int i=raiz->prinodo;i<=raiz->ultimon;i++) 
    { 
     cout<<str.at(i); 
    } 
    cout<<"\n";Imprime 
} 
for(int i=0;i<27;i++) 
{ 
    Imprime(raiz->ptr[i],str); 
} 
} 


int main(int argc, char const *argv[]) 
{ 
    std::cout << "Nombre del archivo: \n" ; // Pregunta el nombre del archivo a buscar la cadena 
    std::string input ; 
    std::getline(std::cin , input) ; 
    std::ifstream infile(input.c_str() , std::ios::in) ; 
    std::string file(input) ; 
    std::cout << "Inserte el número de linea de la cadena: " ; //Pregunta el nombre de la línea donde se buscará la cadena 
    std::getline(std::cin , input) ; 
    int linenumber = std::stoi(input) ; 
    int lines_read = 0 ; 
    std::string line ; 
    if (infile.is_open()) { 
     while (infile) { 
    getline(infile , line) ; 
    lines_read++ ; 
    if (lines_read == linenumber) { 
     std::cout <<"Palabra: "<< line << std::endl ; //Imprime la palabra 

        primero=line.length()-1; 
       line=line+"$"; 
        raiz=new nodo(-1,-1); 

         for(int i=line.length()-1;i>=0;i--) //Hace la separación dela palabra e iprime los prefijosImprime 
         { 
          raiz=crea(raiz,line,i); 
          Imprime(raiz,line); 
          cout<<""; 
         } 

      break; 
     } 
     } 

    } 


return 0; 
} 
Смежные вопросы