字典树数据结构

题目:

编写Trie树基本操作,包括插入,搜索,销毁

分析:

字典树,就是一棵26叉树(不考虑树的字符的大小写问题),在每个节点中加入计数器,表示从根节点到达当前节点的字符流表示一个字符串,代码如下:

#include <iostream>
#include <cstdio>
using namespace std;

#define ELEMENT_MAX 26


typedef struct trie_node
{
	int count;
	struct trie_node * next[ELEMENT_MAX];
}*pTrie;

int err = 0;

bool insertTrie(pTrie root, const char * str)
{
	if(root == NULL || str == NULL)
	{
		return false;
	}

	pTrie p = root;
	while(*str != '\0')
	{
		if(p->next[*str - 'a'] == NULL)
		{
			p->next[*str - 'a'] = (pTrie)malloc(sizeof(struct trie_node));

			if(p->next[*str - 'a'] == NULL)
			{
				return false;
			}
			p->next[*str - 'a']->count = 0;			//一定要进行初始化操作
			for(int i = 0; i < ELEMENT_MAX; i++)
				p->next[*str - 'a']->next[i] = NULL;
		}

		p = p->next[*str - 'a'];
		str++;
	}
	p->count++;
	return true;
}

bool searchTrie(pTrie root, const char * str)
{
	if(root == NULL || str == NULL)
	{
		return false;
	}

	pTrie p = root;
	while(*str != '\0')
	{
		if(p->next[*str - 'a'] == NULL)
			return false;
		else
		{
			p = p->next[*str - 'a'];
			str++;
		}
	}
	if(p->count > 0)
		return true;
	return false;
}

void deleteTrie(pTrie root)
{
	if(root == NULL)		//必须首先判定是否为NULL
		return ;

	for(int i = 0; i < ELEMENT_MAX; i++)
	{
		deleteTrie(root->next[i]);
	}
	free(root);
	return ;
}

int main()
{
	char str[20];
	pTrie root = (pTrie)malloc(sizeof(struct trie_node));
	root->count = 0;
	for(int i = 0; i < ELEMENT_MAX; i++)
		root->next[i] = NULL;

	printf("Input the number of str: \n");
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%s", str);
		insertTrie(root,str);
	}

	printf("Input the search str: \n");
	while(scanf("%s", str) != EOF)
		cout << searchTrie(root, str) << endl;

	deleteTrie(root);

	return 0;

}

总结:

字典树出现的频率比较高,通过使用字典树,可以对大量字符串进行高效查找。

你可能感兴趣的:(数据结构,struct,null,search,input)