#include<iostream>
using namespace std;
int num;//树的数目
class Trie{
private:
int count;//记录单词数
Trie* child[256];//子树指针
public:
Trie(){count=0;memset(child,0,sizeof(child));};
void Insert(Trie* root,char* word);
void Trace(Trie* root);
};
//遍历结点
void Trie::Trace(Trie* root)
{
static int pos;//遍历深度
static char dump[31];//存储遍历得到的字符串
if(root->count)//如果count不为0,则肯定找到了一个单词
{
dump[pos]='\0';
if(dump[0]!=0)
{
printf("%s %0.4f\n",dump,((float)root->count*100)/(float)num);
}
}
else
{
for(int i=0;i<256;i++)
{
if(root->child[i]!=0)//如果子树存在
{
dump[pos]=i;
pos++;//往下遍历,pos跟着后移,供孩子节点使用
Trace(root->child[i]);
pos--;//恢复位置,供下一个兄弟节点使用
}
}
}
}
//插入结点
void Trie::Insert(Trie* root,char* word)
{
Trie* ptr=root;
char*p=word;
for(p;*p;p++)
{
if(!ptr->child[*p])//若子树为空
ptr->child[*p]=new Trie();
ptr=ptr->child[*p];//移动当前指针
}
ptr->count++;
}
int main()
{
char s[31];
Trie* root=new Trie();
while(gets(s))
{
if(!s[0]) break;
root->Insert(root,s);
num++;
}
root->Trace(root);
return 0;
}
程序解释:
1.结点的数据有
int count;//记录单词数
Trie* child[256];//子树指针
只有叶子结点的count!=0,其他结点的count都为0;
所以:if(root->count)//如果count不为0,则肯定到了叶子结点,即找到了一个单词
2. static int pos;//遍历深度
static char dump[31];//存储遍历得到的字符串
必须定义为静态变量
每次递归调用都要保持该数据值。