typedef struct node
{
int num;//表示节点分支。即个数
struct node *br[26];//分支 预先
}
void Tree_Insert(char str[])
{
Node *t,*s = head;//用于中间的新建节点,s用于对头指针开始操作
int len = strlen(str) - 1;
for(int i = 0; i <= len; i ++)
{
int id = str[i] - 'a';
/*
对字符串str,对每一次循环,
如果当前指针s下面的对应于当前字符str[i]在
字母表的位置的孩子节点为空,
就说明此时该字符串str于其他的字符的公共前缀
最多延伸到s处,
接着就需要新建节点了,同时对新建节点
以及新建节点的孩子进行初始化(尤其是num的初始化),*/
if(s->br[id] == NULL)
{
t = new Node;
for(int j = 0; j <= 25; j ++)
t->br[j] = NULL;
t->num = 0;
s->br[id] = t;
}
s = s->br[id];/*当前指针s下面
的对应于当前字符str[i]在字母表的位置的孩子结点不为空,
那么此时就不需要进行新建节点,指针向下移动即可*/
s->num ++;
}
}
int Tree_Find(char str[])
{
Node *s = head;
int count;//每次查找都用count保存当前指针的孩子节点(不为空)的num值
int len = strlen(str) - 1;
for(int i = 0; i <= len; i ++)
{
int Id = str[i] - 'a';
if(s->br[Id] == NULL)//如果为空的话,那么就说明此时这棵树中没有以str为公共前缀的字符串,那么久可以返回为0
{
count = 0;
return count ;
}
else
{
s = s->br[Id];
count = s->num;//每次查找都用count保存当前指针的孩子节点(不为空)的num值,最终得到的就是以str为前缀的字符串的数目;
}
}
return count;
}
POJ-3630很典型的一道题
POJ-3630很典型的一道题