1. 程式人生 > >PTA 03-樹1 樹的同構(25 分)

PTA 03-樹1 樹的同構(25 分)

#include<iostream>
#define Maxsize  10
using namespace std;

struct TreeNode{
	int left;
	int right;
	char index;
}T1[Maxsize],T2[Maxsize];

int isomorphic(int R1,int R2)
{
	if((R1==-1)&&(R2==-1))
	   return 1;
	if(((R1==-1)&&(R2!=-1))||((R1!=-1)&&(R2==-1)))
	   return 0;
	if(T1[R1].index!=T2[R2].index) 
	   return 0;
	if((T1[R1].left==-1)&&(T2[R2].left)==-1)
	  return isomorphic(T1[R1].right,T2[R2].right);
	if((T1[R1].right==-1)&&(T2[R2].right)==-1)
	  return isomorphic(T1[R1].left,T2[R2].left);  
	if(((T1[R1].left!=-1)&&(T2[R2].left!=-1))&&((T1[T1[R1].left].index)==(T2[T2[R2].left].index)))
	  return (isomorphic(T1[R1].left,T2[R2].left)&&isomorphic(T1[R1].right,T2[R2].right));
	else
	  return (isomorphic(T1[R1].left,T2[R2].right)&&isomorphic(T1[R1].right,T2[R2].left));  
	        
}

int main()
{
	char c1,c2;
	int n1,n2;
	int check[10];
	cin>>n1;
	int Root1=-1,Root2=-1;
	for(int i=0;i<n1;i++)
	  check[i]=0;
	for(int i=0;i<n1;i++)
	{
		cin>>T1[i].index>>c1>>c2;
		if(c1!='-')
		{
			T1[i].left=c1-'0';
			check[T1[i].left]=1;
		}
		else
		  T1[i].left=-1;
		if(c2!='-')
		{
			T1[i].right=c2-'0';
			check[T1[i].right]=1;
		}  
		else
		  T1[i].right=-1;
	}
	for(int i=0;i<n1;i++)
	{
		if(!check[i])
		{
			Root1=i;
			break;
		}
	}
	cin>>n2;
	for(int i=0;i<n2;i++)
	{
		check[i]=0;
	}
	for(int i=0;i<n2;i++)
	{
		cin>>T2[i].index>>c1>>c2;
		if(c1!='-')
		{
			T2[i].left=c1-'0';
			check[T2[i].left]=1;
		}
		else
		  T2[i].left=-1;
		if(c2!='-')
		{
			T2[i].right=c2-'0';
			check[T2[i].right]=1;
		}
		else
		  T2[i].right=-1;  
	}
	for(int i=0;i<n2;i++)
	   if(!check[i])
	   {
	   	  Root2=i;
	   	  break;
	   }
	   
	int k=isomorphic(Root1,Root2); 
    //cout<<Root1<<Root2<<endl;
	if(k)
	  cout<<"Yes"<<endl;
	else
	  cout<<"No"<<endl;
	return 0;  
}