字典树以及模板

     字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:

   1.根节点不包含任何字符(空根节点)

   2.从根节点到某一节点路径上的字符连起来就是一个字符串

   3.每个节点的所有子节点包含的字符串不相同。

一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数。每个节点还可以用一个布尔变量标记当前节点是否构成单词。Trie主要操作有插入单词,删除单词,查找单词。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
int const MAXN = 26;
struct TrieNode{
	TrieNode(){      //构造函数,包含初始化
		memset(next, 0, sizeof(next));
		exist = false;
		count = 0;
	}
	TrieNode*next[MAXN];
	bool exist;  //记录当前节点是否构成单词
	int count;  //记录当前前缀重复次数
};
TrieNode *root = new TrieNode;
void Insert(char *str){
	TrieNode*p = root;
	while (*str != ''){
		int id = *(str++) - 'a';
		if (p->next[id] == NULL)
			p->next[id] = new TrieNode;
		p = p->next[id];
		p->count++;
	}
	p->exist = true;   //串的最后一个节点标志为构成单词
}
//查询单词
bool Search(char*str){
	TrieNode*p = root;
	while (*str != ''){
		int id = *(str++) - 'a';
		if (p->next[id] == NULL)  //节点不存在
			return NULL;
		p = p->next[id];
	}
	return p->exist;   //返回是否存在单词
}
//删除一个单词
void Delete(char*str){
	//确保树中原来一定含该单词
	TrieNode*p = root;
	while (*str != ''){
		int id = *(str++) - 'a';
		p = p->next[id];
		p->count--;
	}
	p->exist = false;   //串的最后一个节点标志为构
}
//删除一颗字典树
void Delete(TrieNode*T){
	if (T){
		for (int i = 0; i < MAXN; i++)
			Delete(T->next[i]);
		free(T);
		T = NULL;
	}
}

  

原文地址:https://www.cnblogs.com/td15980891505/p/5745959.html