POJ 2001 Trie 字典树

本身写链表就不是很强,搞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;
}


你可能感兴趣的:(c,工作,算法,tree,null,insert)