2010-07-22 112 views
3

我已经学习了尝试和后缀树并希望实现相同。请分享一些链接,我可以从中了解实施的结构和基本思路。尝试和后缀树实现

任何好的例子,如果包括,将是一个加号。在C.

+0

可能重复的[试图数据结构实现.........应用程序 - 字典............](http://stackoverflow.com/questions/ 3323117/tries-data-structure-implementation-application-dictionary) – 2010-07-27 03:25:02

+0

如何通过选择答案来解决这个问题?既然你问了同一个问题,这个问题肯定是多余的。 – AnyOneElse 2013-09-04 13:01:05

+0

Trie和Suffix树上的wikipedia文章为Trie提供了很好的解释和伪代码 – stan0 2015-03-16 13:53:24

回答

2
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct trie trie; 
struct trie 
{ 
     char key; 
     trie *next,*children; 
}; 

trie *newnode(char s) 
{ 
    trie *t=(trie *)malloc(sizeof(trie)); 
    t->key=s; 
    t->next=t->children=NULL; 
} 

void insert(trie **t,char *s,int start) 
{if(s[start]=='\0') 
        { 
          *t=newnode('#'); 
          return; 
        } 
        if(*t==NULL) 
        { 
           *t=newnode(s[start]); 
           insert(&(*t)->children,s,start+1); 
        }  
        if((*t)->key==s[start]) 
        insert(&(*t)->children,s,start+1); 
        else 
        insert(&(*t)->next,s,start); 
} 


bool search(trie *t ,char *s,int start) 
{ 


    if(t==NULL) 
    return false; 

    if(t->key=='#' && s[start]=='\0') 
    return true; 

    if(t->key!='#' && s[start]=='\0' || t->key=='#' && s[start]!='\0') 
    return false; 

    if(t->key==s[start]) 
    return search(t->children,s,start+1); 

    else 
    return search(t->next,s,start); 

    return false; 
} 

/*void push(trie **t ,char *str) 
{      int i=0; 
         for(i=0;i<strlen(str);i++) 
         insert(t,str[i]); 
}*/ 

main() 
{  int i=0; 

     trie *t=NULL; 
     char ch='y'; 
     while(ch=='y') 
     {    
        {char str[20]; 
        fflush(stdin); 
        printf("Enter the word "); 
        gets(str); 


        insert(&t,str,0); 
        } 
        // push(&t,str); 
        fflush(stdin); 
        printf("more y/n ::"); 
        ch=getchar(); 
     } 

     ch='y'; 
     while(ch=='y') 
     {char str[20]; 
     fflush(stdin); 
     printf("Enter the string you want to search::"); 
     gets(str); 

     fflush(stdin); 
     if(search(t,str,0)) 
     printf("Found"); 
     else 
     printf("Not Found"); 

     printf("\n more y/n ::"); 
     scanf("%c",&ch); 

     } 

    getch(); 

} 
-1
#include <iostream> 
#include <string.h> 
using namespace std; 
int high; 
struct stnode 
{ 
    stnode* ptr[27]; 
    int start; 
    int end; 
    stnode(int s,int e) 
    { 
     for (int i = 0; i < 27; ++i) 
     { 
      ptr[i]=NULL; 
     } 
     start=s; 
     end=e; 
    } 
}*root=NULL; 


stnode* fun(stnode* child,string str,int ind) 
{ 
    int s=child->start; 
    while(s<=child->end&&str.at(s)==str.at(ind)) 
     { 
      s++; 
      ind++; 
     } 
    if(s<=child->end) 
    { 
     child->ptr[str.at(ind)-'a']=new stnode(ind,high); 
     if(str.at(s)=='$') 
      child->ptr[26]=new stnode(s,child->end); 
     else 
      child->ptr[str.at(s)-'a']=new stnode(s,child->end); 
     child->end=s-1; 
     return child; 
    } 
    else 
    { 
     if(child->ptr[str.at(ind)-'a']) 
     { 
      child->ptr[str.at(ind)-'a']=fun(child->ptr[str.at(ind)-'a'],str,ind); 
      return child; 
     } 
     else 
     { 
      child->ptr[str.at(ind)-'a']=new stnode(ind,high); 
      return child; 
     } 
    } 

} 



stnode* create(stnode* root,string str,int ind) 
{ 
    if(!root) 
    { 
     root=new stnode(ind,high); 
     return root; 
    } 
    if(str.at(ind)=='$') 
    { 
     root->ptr[26]=new stnode(ind,high); 
     return root; 
    } 
    if(!root->ptr[str.at(ind)-'a']) 
    { 
     root->ptr[str.at(ind)-'a']=new stnode(ind,high); 
     return root; 
    } 
    root->ptr[str.at(ind)-'a']=fun(root->ptr[str.at(ind)-'a'],str,ind); 
    return root; 
} 



void display(stnode* root,string str) 
{ 
    if(!root) 
     return; 
    if(root->start!=-1) 
    { 
     for(int i=root->start;i<=root->end;i++) 
     { 
      cout<<str.at(i); 
     } 
     cout<<"\n"; 
    } 
    for(int i=0;i<27;i++) 
    { 
     display(root->ptr[i],str); 
    } 
} 


int main(int argc, char const *argv[]) 
{ 
    string str; 
    cout<<"enter the string.\n"; 
    cin>>str; 
    str=str+"$"; 
    high=str.length()-1; 

    root=new stnode(-1,-1); 

    for(int i=str.length()-1;i>=0;i--) 
    { 
     root=create(root,str,i); 
     display(root,str); 
     cout<<"\n\n\n"; 
    } 

    return 0; 
} 
+1

您能提供一些上下文吗? – Robert 2015-03-16 10:20:50