字典樹【附加Free例程】

#include <iostream>
#include <string.h>
using namespace std;
#define points 26


struct node;
typedef struct node *NumTree;

struct node
{
	int count;
	NumTree N[points];
};

NumTree init(NumTree T)
{
	T=new struct node;
	int i;
	for(i=0;i<points;i++)
	{
		T->N[i]=NULL;
	}
	return T;
}

void Insert(NumTree T,char str[])
{
	NumTree UseNow,s;
	UseNow=T;
	int i,len;
	len=strlen(str);
	int id;
	for(i=0;i<len;i++)
	{
		id=str[i]-'a';
		if(UseNow->N[id]==NULL)
		{
			s=new struct node;
			s->count=1;
			int j;
			for(j=0;j<points;j++)
				s->N[j]=NULL;
			UseNow->N[id]=s;
			UseNow=UseNow->N[id];
		}
		else
		{
			UseNow->N[id]->count++;
			UseNow=UseNow->N[id];
		}
	}
}

int find(NumTree T,char str[])
{
	int i,id;
	NumTree P;
	P=T;
	int len=strlen(str);
	for(i=0;i<len;i++)
	{
		id=str[i]-'a';
		if(P->N[id]==NULL)
			return 0;
		else
			P=P->N[id];
	}
	return P->count;
}

void FreeTree(NumTree T)
{
	int i;
	for(i=0;i<points;i++)
	{
		if(T->N[i]!=NULL)
		{
			FreeTree(T->N[i]);
			free(T->N[i]);
		}
		else
			return;
	}
	free(T);
}


int main()
{
	NumTree T=NULL;
	T=init(T);
	char str[100];
	while(gets(str) && str[0]!='\0')
		Insert(T,str);
	while(gets(str) && str[0]!='\0')
	{
		int sum=0;
		sum=find(T,str);
		cout<<sum<<endl;
	}
	FreeTree(T);
	return 0;
}



FreeTree例程是我自己寫的,沒有辦法檢驗,但我覺得根據遞歸應該把所有樹都Free掉了,實際運行並沒有出現問題,如果要使用本例程的人建議先檢查一下哈!


如果有缺陷請留言指出!感激不盡!


以下是數組實現,思路沒有改變,但是省略了Malloc的時間,直接從連續數組單元裏提取ROOM。需要注意的是這種情況下Memory數組需要開的很大,不然會WA。

另外數組形式的Free例程有點不對勁···不知道爲什麼運行不了╮(╯▽╰)╭希望有大神指正!


當字典樹超時的時候,用Memory形式存取,會減少一定時間,如果是MLE,那麼可以在每一次處理完畢後Free一次字典樹(不free的話,經過多次建立,會有一個以26爲指數級增長的完全樹,好可怕=。=)


#include <iostream>  
#include <string.h>  
using namespace std;  
#define points 26  
  
  
struct node;  
typedef struct node *NumTree;  
  
struct node  
{  
    int count;  
    NumTree N[points];  
};

struct node Memory[100000];
int ans=0;
  
NumTree init(NumTree T)  
{  
    T=&Memory[ans++];  
    int i;  
    for(i=0;i<points;i++)  
    {  
        T->N[i]=NULL;  
    }  
    return T;  
}  
  
void Insert(NumTree T,char str[])  
{  
    NumTree UseNow,s;  
    UseNow=T;  
    int i,len;  
    len=strlen(str);  
    int id;  
    for(i=0;i<len;i++)  
    {  
        id=str[i]-'a';  
        if(UseNow->N[id]==NULL)  
        {  
            s=&Memory[ans++];  
            s->count=1;  
            int j;  
            for(j=0;j<points;j++)  
                s->N[j]=NULL;  
            UseNow->N[id]=s;  
            UseNow=UseNow->N[id];  
        }  
        else  
        {  
            UseNow->N[id]->count++;  
            UseNow=UseNow->N[id];  
        }  
    }  
}  
  
int find(NumTree T,char str[])  
{  
    int i,id;  
    NumTree P;  
    P=T;  
    int len=strlen(str);  
    for(i=0;i<len;i++)  
    {  
        id=str[i]-'a';  
        if(P->N[id]==NULL)  
            return 0;  
        else  
            P=P->N[id];  
    }  
    return P->count;  
}  
  
void FreeTree()  
{  
    int i;
    for(i=0;i<ans;i++)  
    {
		free(&Memory[i].N);
		free(&Memory[i]);
    }
}  
  
  
int main()  
{  
    NumTree T=NULL;  
    T=init(T);  
    char str[100];
    while(gets(str) && str[0]!='\0')  
        Insert(T,str);  
    while(gets(str) && str[0]!='\0')  
    {  
        int sum=0;  
        sum=find(T,str);  
        cout<<sum<<endl;  
    }  
	FreeTree();
    return 0;  
}  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章