POJ 2001 Trie 字典树

来源:互联网 发布:淘宝店铺推广方法 编辑:程序博客网 时间:2024/05/17 23:44

本身写链表就不是很强,搞acm就是这样,一点点不知道,模棱两可的话 自己是写不出代码的!一定是要对这个算法熟悉了,才能写出来,对于链表尤其是这样!不然对链表进行next操作和当前节点赋值操作的时候都会出问题!这里建了一棵字典树,26插树????用尾插发写的。这几天一直在看专业书,A题比较少。另外这题真的加深了我对树形结构与指针的使用。感觉很不错,对链表的操作过程,感觉要形象的理解才能做出来,不然就会错的~~~

这个树形结构要注意的就是next与赋值语句的过程,要知道自己的赋值到底是赋值在哪里了。

由于root节点是空的。所以每次都是先next到下一个节点再进行标记修改的工作。从根节点出发先next不就到了第一个字符的位置吗?! 然后对第一个字符的标记进行修改。另外呢赋值新点的话,吧尾指针修改成新的节点就好了,然后对标记进行修改。输出也是能够下去再输出!

代码的可读性应该还不错:

#include<iostream>#define MAXN 27#define MAXL 1005using namespace std;struct Node{       int flag;       Node *next[MAXN];}node[MAXN*MAXL];int nodeNum=0;Node *root=&node[nodeNum++];void insert_tree( char *str ){     int i,j,len;     Node *tail=root;     Node *pre;     len=strlen( str );     for( i=0;i<len;i++ )     {          j=str[i]-'a';          if( tail->next[j]!=NULL )          {              tail=tail->next[j];              tail->flag++;          }          else          {              pre=&node[nodeNum++];              pre->flag=1;              tail->next[j]=pre;              tail=pre;          }          printf( "%d ",tail->flag );     }}int main(){    //freopen( "out.txt","w",stdout );    int lineNum=-1;    //nodeNum=0;//!!!!!!     char str[MAXL][MAXN];    while( scanf( "%s",str[++lineNum] )!=EOF )           insert_tree( str[lineNum] );             int i,j,at;    for( i=0;i<lineNum;i++ )    {         Node *tail=root;         printf( "%s ",str[i] );         int len=strlen( str[i] );         for( j=0;j<len;j++ )         {              at=str[i][j]-'a';              tail=tail->next[at];              printf( "%c",str[i][j] );              if( tail->flag==1 )                  break;         }         printf( "\n" );    }    //system( "pause" );    return 0;}


原创粉丝点击