#include<iostream> using namespace std; const int length=26; struct tree_node{ bool isStr;//判断是否是一个完整的字符 struct tree_node* next[length]; tree_node():isStr(false){} }; class tree{ tree_node *root; char base; public: tree(){root=new tree_node();base='a';} bool find(const char*s); void insert(const char*s); void deleteTree(tree_node *root); }; void tree::insert(const char*s){ tree_node *tmp=root; while(*s){ if(tmp->next[*s-base]==NULL){ tree_node * node=new tree_node(); tmp->next[*s-base]=node; } tmp=tmp->next[*s-base]; s++; } tmp->isStr=true; } bool tree::find(const char*s){ tree_node* tmp=root; while(*s && tmp){ tmp=tmp->next[*s-base]; s++; } return (tmp->isStr && s!=NULL); } void tree ::deleteTree(tree_node*root){ for(int i=0;i<length;++i){ if(root->next[i]!=NULL){ deleteTree(root->next[i]); } }delete root; } int main(int argc, char *argv[]) { tree t; t.insert("adgdddddddddddddddd"); t.insert("sdd"); cout<<t.find("sdd")<<endl; cout<<t.find("sd")<<endl; return 0; } pku 3630 http://poj.org/problem?id=3630 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int length=10; bool ok; struct tree_node{ struct tree_node*next[length]; bool isStr; tree_node():isStr(false){memset(next,NULL,sizeof(next));} }node[100000];//用数组代替new 空间,直接提前开辟一个静态空间,节省时间 class tree{ tree_node*root; char base; int num;//记录开辟的节点数目 public: tree(){base='0';root=&node[0];num=1;} void insert(const char*s); void clear(); bool find(const char*s); tree_node* getNode(){ return root; } }; bool tree::find(const char*s){ tree_node *tmp=root; while(*s && tmp){ tmp=tmp->next[*s-base]; s++; } return (tmp!=NULL &&tmp->isStr); } void tree::insert(const char*s){ tree_node *tmp=root; while(*s) { if(tmp->isStr==true)ok=false; if(tmp->next[*s-base]==NULL){ tmp->next[*s-base]=&node[num++];//直接使用已经开辟好的内存空间 } tmp=tmp->next[*s-base]; s++; } if(tmp->isStr==true)ok=false; for(int i=0;i<length;++i){ if(tmp->next[i]!=NULL){ ok=false;return; } } tmp->isStr=true; } void tree::clear(){ for(int i=0;i<num;++i) { node[i].isStr=false; memset(node[i].next,NULL,sizeof(node[i].next)); } num=1; } int main(int argc, char *argv[]) { char word[11]; int n;tree t; cin>>n;int num; for(int i=0;i<n;++i){ ok=true; cin>>num; for(int j=0;j<num;++j){ cin>>word; if(ok)t.insert(word); } if(ok==true)cout<<"YES"<<endl; else cout<<"NO"<<endl; t.clear(); } return 0; }