前缀树TrieTree 操作详解(CPP版)

本文详细介绍了前缀树(TrieTree)的概念、应用场景及C++实现。通过节点结构、插入、查找和删除操作的解析,阐述了TrieTree的基本操作。此外,还探讨了拓展版的Trie树,增加了节点的额外信息以支持更丰富的查询功能。

前缀树

含义

Trie树,即前缀树,又称单词查找树或字典树,是一种树形结构。该树典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

应用

题目:给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置。
在Trie树适用的状态下,很多情况同样可以使用hash树。但是Trie树用途更加的广泛,比如给一个字符串,要寻找有多少单词是以该字符串为前缀的问题。

代码解析
Trie树节点结构

const int branchNum = 26; // 26叉树

struct TrieNode {
   
   
	bool isStr; // 标识是否是一个完整的字符串
	TrieNode *next[branchNum]; // 每个字符的Trie树分支可能存在26个分支
};

Trie树插入操作
/**
 * 前缀树建立的过程
 */
void Insert(TrieNode *root , const char *word){
   
   
	TrieNode *location = root;
	while(*word){
   
   
		// 节点的子节点为空,创建一个子节点
		if(location->next[*word - 'a'] == NULL){
   
   
			TrieNode *newNode = new TrieNode();
			newNode->isStr = false;
			memset(newNode->next , NULL , sizeof(newNode->next));

			location->next[*word - 'a'] = newNode;
		}
		location = location->next[*word - 'a']; // location指向字符串在前缀树中的位置
		word++; // 当前字符在字符串中的位置
	}
	// 字符串已经全部添加到前缀树中,
	// 标识前缀树到该节点为止为完整字符串
	location->isStr = true;
}
Trie树查找操作
/**
 * 遍历前缀树,查看指定字符串是否存在
 */
bool Search(TriNode *root , const char *word){
   
   
	TrieNode *location = root;
	while(*word && location != NULL){
   
   
		location = location->next[*word - 'a'];
		word++;
	}
	return (location != NULL && location->isStr);
}

Trie树删除操作

/**
 * 删除前缀树
 */
void Delete(TrieNode *location){
   
   
	for(int i = 0; i < branchNum; i++){
   
   
		if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值