400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

C++实现前缀树-创新互联

一 、前缀树是什么二、简单前缀树的结构分析

如需理解以下内容,首先你需要了解树的结构;

我们提供的服务有:成都网站设计、成都网站建设、微信公众号开发、网站优化、网站认证、站前ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的站前网站制作公司
  1. 比如二叉树,父节点之下包含两个节点,分别为左右子节点,分别开辟空间,进行数据存储。
  2. 前缀树的结构也是类似的,它的每个节点包含两个部分: 值部分和指针部分。
  3. 它的存储方式为:在一棵树上,从根到子节点,分别存储所有目标数据的每一个下标位置上的数据
  4. 值部分主要又包含两个数据: 路过该节点的数量为pass, 以该节点为结尾的数量为end
  5. 指针部分主要包含它的所有子节点,记为next
下面给出实现,一共四个接口:
  1. insert插入字符串,给前缀树添加一组数据
  2. find查找已存入的字符串个数
  3. findContain输入前缀查找已存在的前缀相同的字符串个数
  4. erase从前缀树中擦除一个字符串及其所存在数据
代码:
#includeusing namespace std;
//26 个小写英文字母
#define NUMBER 26

// 节点的结构
class TrieNode
{public:
	int pass;
	int end;
	TrieNode* nexts[NUMBER];
	TrieNode()
	{pass = 0;
		end = 0;
		for (int i = 0; i< NUMBER; i++)
		{	nexts[i] = nullptr;
		}
	}
	~TrieNode()
	{for (int i = 0; i< NUMBER; i++)
		{	if (nexts[i]) delete nexts[i];
		}
	}
};

// 所调用的树结构
class TrieTree
{TrieNode* root = nullptr;
public:
	TrieTree()
	{root = new TrieNode();
	}
	// 插入
	void insert(string word)
	{TrieNode* cur = root;
		cur->pass++;
		for (int i = 0; i< word.size(); i++)
		{	
			int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr)
			{		cur->nexts[num] = new TrieNode();
			}
			cur = cur->nexts[num];
			cur->pass++;
		}
		cur->end++;
	}
	//查找字符串数量
	int find(string word)
	{TrieNode* cur = root;
		for (int i = 0; i< word.size(); i++)
		{	int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr) return 0;

			cur = cur->nexts[num];
		}
		return cur->end;
	}
	//查找前缀数量
	int findContain(string word)
	{TrieNode* cur = root;
		for (int i = 0; i< word.size(); i++)
		{	int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr) return 0;

			cur = cur->nexts[num];
		}
		return cur->pass;
	}
	//删除
	bool erase(string word)
	{if (find(word) == 0) return false;
		TrieNode* cur = root;
		for (int i = 0; i< word.size(); i++)
		{	int num = word[i] - 'a';

			if (cur->nexts[num]->pass<= 1)
			{		delete cur->nexts[num];
				cur->nexts[num] = nullptr;
				return true;
			}
			cur = cur->nexts[num];
			cur->pass--;
		}
		cur->end--;
		return true;
	}
};

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:C++实现前缀树-创新互联
新闻来源:http://mbwzsj.com/article/disejd.html

其他资讯

让你的专属顾问为你服务