Trie树

/* Trie树,又叫做字典树,是一种用来求字符串前缀出现次数的数据结构。Trie树很像有限状态机,每个节点虽然不存储具体的键,但是都对应一个字符串*/
#include <iostream>
using namespace std;
#define MAX 26
/*定义节点结构*/
typedef struct TrieNode
{
	int nCount;
	TrieNode* next[MAX];
}TrieNode;

/*初始化Trie树*/
void InitTrie(TrieNode * &root)
{
	root = NULL;
}

/*创建一个新的Trie节点*/
TrieNode* CreateTrieNode()
{
	TrieNode *p = new TrieNode;
	p->nCount = 1;
	for (int i = 0;i < MAX;i++)
	{
		p->next[i] = NULL;
	}
	return p;
}

/*根据一个字符串插入一个节点*/
void InsertTrieNode(TrieNode* &root,char* s)
{
	TrieNode* p;
	int i = 0;
	if (!root)
	{
	   root = CreateTrieNode();
	}
	p = root;
	while(s[i])
	{
		int k = s[i] - 'a';//求字符偏移,确定在next[MAX]中的位置
		if (!p->next[k])
		{
			p->next[k] = CreateTrieNode();
			p = p->next[k];
		}
		else
		{
			p->next[k]->nCount++;
			p = p->next[k];
		}
		i++;
	}
}

/*根据一个字串查找以该字串为前缀的字符串的个数*/
int SearchTrie(TrieNode* &root,char* s)
{
	TrieNode* p = root;
	int i = 0;
	if (!p)
	{
		return 0;
	}
	while(s[i])
	{
		int k = s[i] - 'a';
		if (!p->next[k])
		{
			return 0;
		}
		else
		{
			p = p->next[k];
		}
		i++;
	}
	return p->nCount;
}

int main(int argc,char** argv)
{
	char s[15] = {0};
	TrieNode *Root = NULL;
	InitTrie(Root);

	while(gets(s) && s[0])
	{
		InsertTrieNode(Root,s);
		memset(s,0,15);
	}
	cout<<"输入要查询的字符串:\n"<<endl;
	while(gets(s))
	{
		cout<<SearchTrie(Root,s)<<endl;
		memset(s,0,15);
	}
	return 0;
}

  

你可能感兴趣的:(trie)