---恢复内容开始---
trie树,我是设置了号码结束标志,在insert函数里做处理:如果在插入的过程中,一直没有开辟新的节点,说明新插入的这个号码是某个已经插入了的号码的前缀,输出“NO”。如果在插入的过程中,经过了结束标志,说明这个新插入的号码之前已经插入了前缀号码,同样的,输出“NO”。此外,都输出“YES”。
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<string.h> 4 typedef struct tnode 5 { 6 int mark; 7 tnode *next[10]; 8 }tnode; 9 tnode *root; 10 void init() 11 { 12 int i; 13 root=(tnode*)malloc(sizeof(tnode)); 14 for(i=0;i<10;i++) 15 root->next[i]=NULL; 16 root->mark=0; 17 18 } 19 int insert(char *str) 20 { 21 tnode *r=root,*child; 22 int i,flag=0; 23 while(*str!='\0') 24 { 25 if(r->next[*str-'0']==NULL) 26 { flag=1; 27 child=(tnode*)malloc(sizeof(tnode)); 28 for(i=0;i<10;i++) 29 child->next[i]=NULL; 30 child->mark=0; 31 r->next[*str-'0']=child; 32 33 34 } 35 if(r->next[*str-'0']->mark==1){flag=0;break;} 36 r=r->next[*str-'0']; 37 str++; 38 39 } 40 r->mark=1; 41 if(!flag) return 1; 42 else return 0; 43 } 44 void del(tnode *r) 45 { 46 for(int i=0;i<10;i++) 47 { 48 if(r->next[i]!=NULL) 49 del(r->next[i]); 50 } 51 free(r); 52 } 53 54 int search(char *str) 55 { 56 tnode *r=root; 57 int i=0,len,j; 58 len=strlen(str); 59 for(j=0;j<len-1;j++) 60 { 61 r=r->next[str[i]-'0']; 62 } 63 for(i=0;i<10;i++) 64 if(r->next[i]!=NULL) 65 return 1; 66 return 0; 67 } 68 int main() 69 { 70 int T,n,i,flag,mark; 71 char num[10005][20],ch; 72 scanf("%d",&T); 73 while(T--) 74 { 75 scanf("%d",&n); 76 ch=getchar(); 77 init(); 78 gets(num[0]); 79 flag=insert(num[0]); 80 mark=0; 81 for(i=1;i<n;i++) 82 { 83 gets(num[i]); 84 flag=insert(num[i]); 85 if(flag)mark=1;; 86 } 87 88 89 if(mark)printf("NO\n"); 90 91 else printf("YES\n"); 92 del(root); 93 94 } 95 96 return 0; 97 }
---恢复内容结束---