暑假- Trie树-(G - IMMEDIATE DECODABILITY)

/*
题意:给你一堆2进制编码,判断是否任何一组编码都不是其他编码的前缀。
思路:trie树,是不是其他编码的前缀只要判断最后一个数字出现的次数,若只出现一次则 
这个号码不会是其他编码的前缀,否则是其他编码的前缀。 
*/
#include<iostream>
#include<cstring>
using namespace std;
const int MAXM=100005;
struct Node
{
	int value;//出现的次数
	Node *child[2];//只有2个孩子节点[0/1]
	Node()
	{
		value=0;
		memset(child,NULL,sizeof(child));
	}
}*root;
char num[15][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++;
	}
}
void Search(char s[])//查询
{
	Node *x=root;
	int len=strlen(s);
	for(int i=0;i<len;i++)
	{
		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<2;i++)
	{
		if(x->child[i]!=NULL)
		{
			DeleteNode(x->child[i]);
		}
	}
	delete x;
}
int main()
{
	int t=0,k=0,ans=1;
	while(cin>>num[t])
	{
		if(num[t][0]=='9')//每组数据以‘9’结束
		{
			temp=true;
			root=new Node;
			for(int i=0;i<t;i++)
			{
				create(num[i]);
			}
			for(int i=0;i<t;i++)
			{
				Search(num[i]);
				if(temp==false)
				{
					break;
				}
			}
			if(temp)
			{
				cout<<"Set "<<ans<<" is immediately decodable"<<endl;
			}
			else
			{
				cout<<"Set "<<ans<<" is not immediately decodable"<<endl;
			}
			ans++;
			t=0;
			k=1;
			DeleteNode(root);
		}
		t++;
		t-=k;//k用于保证每一组数据结束k都从0开始。
		k=0;
	}
	return 0;
}
		
	

    原文作者:Trie树
    原文地址: https://blog.csdn.net/slime_kirito/article/details/47102727
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞