HDU 3791
这个题是考数据结构的二叉排序树,对每个输入的字符串都建立一棵二叉树,然后进行先序遍历,进行后序遍历( 因为由两个遍历可以确定一棵树 ),所以每次只要先建立一棵树,然后把他们的先序遍历和后序遍历比较,若都相等就YES,否则NO
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *lc,*rc;
}node,*Link;
int n,f,c,cnt;
char f1[11],la1[11],f2[11],la2[11];
void insert( Link *L,int x )
{
if( *L )
{
if( x < ( *L ) -> data )
insert( &( *L ) -> lc , x );
else
insert( &( *L ) -> rc , x );
}
else
{
*L = new node;
( *L ) -> data = x;
( *L ) -> lc = ( *L ) -> rc = NULL;
}
}
void print1(Link L,char f[] )
{
if( L )
{
f[cnt++] = L ->data + '0';
print1( L -> lc ,f);
print1( L -> rc ,f);
}
}
void print2( Link L, char la[] )
{
if( L )
{
print2( L -> lc, la );
print2( L -> rc, la );
la[cnt++] = L -> data + '0' ;
}
}
int main( )
{
while( scanf( "%d",&n ),n )
{
f = 1;
Link L = NULL;
Link L1 = NULL;
char str[11];
scanf( "%s",str );
c = strlen( str );
for( int i = 0; i < c; ++i )//建立一棵树
insert( &L , str[i] - '0' );
cnt = 0;
print1( L ,f1);//先序遍历
f1[cnt] = 0;
cnt = 0;
print2( L,la1 );//后序遍历
la1[cnt] = 0;
for( int i = 0; i < n; ++i )
{
f = 1;
memset( f2,0,sizeof( f2 ) );
memset( la2,0,sizeof( la2 ) );
scanf( "%s",str );
c = strlen( str );
for( int i = 0; i < c; ++i )//建立一棵树
insert( &L1, str[i] - '0' );
cnt = 0;
print1( L1,f2 );//先序遍历
f2[cnt] = 0;
cnt = 0;
print2( L1,la2 );//后序遍历
la2[cnt] = 0;
if( strcmp( f1,f2 ) != 0 || strcmp( la1,la2 ) != 0 )
f = 0;//若有不相等
free( L1 );
L1 = NULL;
puts( f ? "YES" : "NO" );
}
free( L );
L = NULL;
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号