字典树

存储方式:数组或struct结构体

数组储存:

const int charsize = 26;//字符集大小

//记录此节点的子节点编号
//这里默认的全是小写字母
int nxt[maxn + 1][charsize];

//表示此编号节点是否为终止节点
bool isend[maxn + 1];

//cnt储存当前的节点编号数
int root = 0, cnt = 0;

字典树的插入

从根节点开始加入一条表示当前字符串的路径,在过程中如果没有对应的字符节点就新建一个

//s为等待插入的字符串,下标从1开始,len为字符串长度
void insert(char s[], int len) {
    int now = 0;
    for (int i = 1; i <= len; i++) {//注意题意是从1至n还是从0至n-1
        int x = s[i] - 'a';
        if (!nxt[now][x]) {//now表示当前位置编号,x表示下一个节点的字母(在这里默认是小写字母)
            nxt[now][x] = ++cnt;
        }
        now = nxt[now][x];
    }
    isend[now] = true;
}

字典树的查找:

从根节点开始,如果有对应的字符就向下跳,如果没有就失败。最后判断字符串末尾的节点有没有结束标记

字典树的struct存储方式

例题:

给你 n 个两两不同的字符串,你要按字典序从小到大的顺序将这些字符串排好,再按顺序输出。

字符串按字典序排序是指以字符串第 i 个字符作为第 i 关键字进行的排序,空字符小于字符集内任何字符。

Last updated