trie动态建树与静态建树

trie是一种多叉树,又叫字典树,是一种最少为两层的树结构。其在字符串的检索和数字的检索方面以及前缀判断方面有着很大的用途,而字典树的创建又分为动态建树和静态建树。相应的操作有插入,查询,和删除(整棵树)。下面分别给出动态建树和静态建树的代码(相关和trie性质的信息请自行百度):

动态建树:

#include<stdio.h>
#include<stdlib.h>
#define Max 110
typedef struct Node{
	int count;
    struct Node *next[26];
}node,*npivot;
char test[20];
int num;
void Insert_trie(npivot root){
	char *index=test;
	npivot pivot=root;
	while(*index!='\0'){
		int temp=*index-'a';
		if(pivot->next[temp])
			pivot=pivot->next[temp];
		else{
			pivot->next[temp]=(npivot)malloc(sizeof(node));
			for(int i=0;i<26;i++)
			pivot->next[temp]->next[i]=NULL;
			pivot->next[temp]->count=0;
			pivot=pivot->next[temp];
		}
		index++;
	}
	pivot->count++;
}
void Build_trie(npivot root){
	for(int i=0;i<10;i++){
		scanf("%s",test);
		Insert_trie(root);
	}
}
bool Search_words(npivot root,char *source){
	npivot pivot=root;
	char *index=source;
	while(*index!='\0'){
		if(pivot->next[*index-'a']==NULL)
			break;
		//printf("%c\n",'a'+*index);
		pivot=pivot->next[*index-'a'];
		index++;
	}
	if(*index=='\0' && pivot->count>0){
		num=pivot->count;
		return 1;
	}
	else
		return 0;
}
void Delete_trie(npivot root){
	for(int i=0;i<26;i++)
	    if(root->next[i])
		Delete_trie(root->next[i]);
	free(root);
}
int main(){
	npivot root=(npivot)malloc(sizeof(node));
	for(int i=0;i<26;i++)
		root->next[i]=NULL;
	root->count=0;
	Build_trie(root);
	while(true){
		scanf("%s",test);
		if(Search_words(root,test))
			printf("exist and the number is %d\n",num);
		else
			printf("no exist\n");
	}
	Delete_trie(root);
	return 0;
}

静态建树(注意静态建树是指事先创建节点数组,然后当需要建立节点时,就是用节点数组)下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 1000010
struct Node{
	bool flag;
	int count;
	struct Node *next[26];
}node[Max];
typedef struct Node* npivot;
char Input[12];
int move=0;
void Insert_heap(npivot root){
	npivot pivot=root;
	char *index=Input;
	while(*index!='\0'){
		int temp=*index-'a';
		if(!pivot->next[temp]){
			pivot->next[temp]=&node[move++];
			pivot->next[temp]->flag=0;
		    pivot->next[temp]->count=0;
			memset(pivot->next[temp]->next,0,sizeof(pivot->next[temp]->next));
		}
		index++;
		pivot=pivot->next[temp];
	}
	pivot->flag=1;
	pivot->count++;
}
void Build_heap(npivot root){
	for(int i=0;i<12;i++){
		scanf("%s",Input);
		Insert_heap(root);
	}
}

void Search_heap(npivot root){
	char *index=Input;
	npivot pivot=root;
	while(*index!='\0'){
		if(!pivot->next[*index-'a'])
			break;
		pivot=pivot->next[*index-'a'];
		index++;
	}
	if(*index!='\0' || !pivot->flag)
	    printf("no exist\n");
	else
	    printf("exist and the num is: %d\n",pivot->count);
}			
void Delete_heap(npivot root){
	memset(root->next,0,sizeof(root->next));
}
int main(){
	npivot root=&node[move++];
	memset(root->next,0,sizeof(root->next));
	Build_heap(root);
	for(int i=0;i<12;i++){
		scanf("%s",Input);
		Search_heap(root);
	}
	Delete_heap(root);
	return 0;
}
			
			
		
		
	
	
	

静态建树与动态建树的主要区别在于插入和删除操作,前者每次插入一个新节点当不存在相应字符时就利用实现已经创建好的数组存放,后者则动态申请一个节点。删除操作,前者直接将根节点的next全部置为NULL即可,后者要释放所有动态申请的节点空间。查询操作基本上一样。
测试数据:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值