poj Shortest Prefixes ——trie树、字典树,基础!!

我的第一道tire树,很基础,很好!!!!!!!!! 

#include<iostream>
using namespace std;
#define max 26
char ss[1005][50];
char tt[50];
struct node//初始tire树
{
 int num;//标记是否为相同前缀最后字符
 node *next[max];//后继结点
};
node *root; //建立根节点的引用
void trie()//初始tire 树
{
 int i,j;
 root=new node;//为根节点开辟内存
 root->num=0;
 for(int i=0;i<max;i++)
 root->next[i]=NULL;
}
void insert(char ss[])//插入操作
{
 node *p=root,*t;//p指向当前节点,t用来开辟内存
 for(int i=0;ss[i];i++)//将每个字符存起来的过程
 {
  if(p->next[ss[i]-'a']==NULL)//当p指向为空的时候,需要开辟新的节点
  {
   t=new node;
   t->num=0;
   for(int i=0;i<max;i++)
   t->next[i]=NULL;
   p->next[ss[i]-'a']=t;//接上新的节点
  }
  p=p->next[ss[i]-'a'];//p指向下一个节点
  p->num++;//
 }
}
void search(char ss[])//查找
{
 node *p=root;//p指向根节点
 int t=0;
 for(int i=0;ss[i];i++)
 {
  p=p->next[ss[i]-'a'];//p指向下一结点
  if(p->num>1)
  {
   tt[t]=ss[i];
   t++;
  }
  if(p->num==1)
  {
   tt[t]=ss[i];
   tt[t+1]='\0';
   return;
  }
 }
 tt[t]='\0';//这个是防止上面的p->num都是大于1的
 return ;
}
int main()
{
 trie();
 int t=0;
 while(cin>>ss[t])
 {
  insert(ss[t]);
  t++;
 }
 for(int i=0;i<t;i++)
 {
  printf("%s ",ss[i]);
  search(ss[i]);
  printf("%s\n",tt);
 }
// system("pause");
 return 0;
}
  
 

你可能感兴趣的:(poj Shortest Prefixes ——trie树、字典树,基础!!)