暑假- Trie树-(D - Phone List)

/*
题意:给你一堆电话号码,如果没有任何一个人的电话号码是其他的电话号码的前缀,则
输出“YES”,否则输出“NO”。
思路:trie树,是不是其他号码的前缀只要判断最后一个数字出现的次数,若只出现一次则
这个号码不会是其他号码的前缀,否则是其他号码的前缀。
*/
#include<iostream>
#include<cstring>
using namespace std;
const int MAXM=100005;
struct Node
{
	int value;
	Node *child[26];
	Node()
	{
		value=0;
		memset(child,NULL,sizeof(child));
	}
}*root;
char num[MAXM][15];//保存号码
bool temp;//判断是否出现前缀号码
void create(char s[])//建树
{
	Node *x=root;
	for(int i=0;i<strlen(s);i++)
	{
		int d=s[i]-'0';
		if(x->child[d]==NULL)
		{
			x->child[d]=new Node;
		}
		x=x->child[d];
	}
	x->value++;//最后一个数字的value++
}
void Search(char s[])//判断
{
	Node *x=root;
	int len=strlen(s);
	for(int i=0;i<len;i++)//循环出来后,X即为最后一个数码的节点。
	{
		int d=s[i]-'0';
		x=x->child[d];
	}
	if(x->value!=1)//若出现不止一次。
	{
		temp=false;
	}
}
void DeleteNode(Node *x)//删除之前节点的信息
{
	if(x==NULL)
	{
		return;
	}
	for(int i=0;i<26;i++)
	{
		if(x->child[i]!=NULL)
		{
			DeleteNode(x->child[i]);
		}
	}
	delete x;
}
int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		temp=true;
		cin>>n;
		root = new Node;
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
			create(num[i]);
		}
		for(int j=0;j<n;j++)
		{
			Search(num[j]);
			if(temp==false)//只要出现一个前缀字符,其他就不用判断了
			{
				break;
			}
		}
		if(temp)
		{
			cout<<"YES"<<endl;
		}
		else
		{
			cout<<"NO"<<endl;
		}
		DeleteNode(root);
	}
	return 0;
}
		
	

你可能感兴趣的:(数据结构树)