字典树详解

本文介绍了一种用于统计和排序大量字符串的高效数据结构——字典树。通过利用字符串的公共前缀来减少查询时间,提高了查询效率。文章详细阐述了字典树的基本结构,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典树

一  简介

字典树(单词查找树),是一种树形结构,应用于统计、排序和保存大量字符串。优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无畏字符串的比较,查询效率高于哈希树。

二 基本结构

字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。因此构造字典树和查询的思路一致:从单词的第一个字母开始,看是否存在,如果存在,接着看第二个字母,否则,创建一个新的分支节点直至最后一个字母。

三 代码实现

//定义节点结构
const int maxsize = 26;
typedef struct TrieNode
{
	bool isStr;
	TrieNode* next[maxsize];
	TrieNode() :isStr(false)
	{
		memset(next, NULL, sizeof(next));
	}
};

class Trie
{
private:
	TrieNode* root;
public:
	Trie()
	{
		root = new TrieNode();
	}
	void insert(const string& s);
	bool search(const string& str);
	TrieNode* getRoot()
	{
		return root;
	}
	void deleteTrie(TrieNode* root);
};

void Trie::insert(const string& s)
{
	const int n = s.size();
	TrieNode* p = root;
	for (int i = 0; i < n; ++i)
	{
		if (p->next[s[i] - 'a'] == NULL)
		{
			TrieNode* tmp = new TrieNode();
			p->next[s[i] - 'a'] = tmp;
		}
		p = p->next[s[i] - 'a'];
	}
	p->isStr = true;
}

bool Trie::search(const string& str)
{
	const int n = str.size();
	TrieNode* p = root;
	for (int i = 0; i < n; ++i)
	{
		if (p->next[str[i] - 'a'] != NULL)
		{
			p = p->next[str[i] - 'a'];
			continue;
		}
		else
			return false;
	}
	return (p!=NULL)&&(p->isStr);
}

void Trie::deleteTrie(TrieNode* root)
{
	if (root != NULL)
	{
		for (int i = 0; i < maxsize; ++i)
		{
			if (root->next[i] != NULL)
			{
				deleteTrie(root->next[i]);
			}
		}
		delete root;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值