字典树

 

字典树 

HDU 1251

代码
   
     
#include < iostream >
using namespace std;

const int kind = 26 ; // 字母种类

struct Treenode // 树的结点结构
{
int count; // 这个附加变量在本题中记录遍历到该结点形成的字符串出现的次数,在不同题中可记录不同的内容。
Treenode * next[kind]; // 指向儿子结点
Treenode() // 每个结点的初始化
{
count
= 1 ;
for ( int i = 0 ;i < kind;i ++ )
next[i]
= NULL;
}
};

void insert(Treenode *& root, char * word) // 向以root为根结点的树中插入串word
{
Treenode
* location = root;
int i = 0 ,branch = 0 ;

if (location == NULL) {location = new Treenode();root = location;}

while (word[i])
{
branch
= word[i] - ' a ' ;
if (location -> next[branch]) location -> next[branch] -> count ++ ; // 如果该字符存在,串数量加1
else location -> next[branch] = new Treenode(); // 如果不存在,建新结点
i ++ ;
location
= location -> next[branch];
}
}

int search(Treenode * root, char * word) // 查找,与插入类似
{
Treenode
* location = root;
int i = 0 ,branch = 0 ,ans;

if (location == NULL) return 0 ;

while (word[i])
{
branch
= word[i] - ' a ' ;
if ( ! location -> next[branch]) return 0 ;
i
++ ;
location
= location -> next[branch];
ans
= location -> count;
}
return ans;
}
int main()
{
char word[ 10 ];
char ask[ 10 ];
Treenode
* root = NULL;
while (gets(word))
{
if (word[ 0 ] == ' \0 ' ) break ;
insert(root,word);
}
while (gets(ask))
cout
<< search(root,ask) << endl;
return 0 ;
}

 

你可能感兴趣的:(字典树)