字典树模板(动态)

来源:互联网 发布:php调用网页代码 编辑:程序博客网 时间:2024/06/05 16:53
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很典型的一道题
0 0
原创粉丝点击