当前位置: 代码迷 >> 综合 >> POJ 2001 Trie 字典树
  详细解决方案

POJ 2001 Trie 字典树

热度:52   发布时间:2024-01-20 20:51:22.0

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

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

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

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

#include<iostream>
#define MAXN 27
#define MAXL 1005
using 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;
}