二叉搜索树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6897 Accepted Submission(s): 3057
Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
做了好多遍的二叉搜索树,,然鹅还是不太熟练,所以作为模板好好记住
#include <stdio.h>
#include <string.h>
typedef struct BT {
int data;
struct BT *lchild,*rchild;
BT() {
this->lchild = NULL;
this->rchild = NULL;
}
} BT,*BTree;
char c[21];
//遍历
//void trave( BTree T ) {
// if( T->lchild )
// trave( T->lchild );
// printf( "%d ",T->data );
// if( T->rchild )
// trave( T->rchild );
//}
//元素添加
void add( int value , BTree &T ) {
if( T==NULL ) {
T = new BT();
T->data = value;
T->lchild = T->rchild = NULL;
return;
} else if( T->data>value ) {
add( value,T->lchild );
} else {
add( value,T->rchild );
}
}
//判断两棵二叉搜索树是否完全相同
bool judge( BTree T1 , BTree T2 ) {
if( T1==NULL && T2!=NULL || T1!=NULL && T2==NULL ) {
return false;
}else if( T1==NULL && T2==NULL ){
return true;
} else if( T1->data!=T2->data ) {
return false;
} else
return judge( T1->lchild,T2->lchild ) && judge( T1->rchild,T2->rchild );
}
int main() {
int n;
while( ~scanf( "%d",&n ) && n ) {
BTree T1;
T1 = NULL;
int s;
scanf( "%s",c );
for( int i=0 ; c[i] ; i++ ) {
s = c[i] - '0';
add( s,T1 );
}
while( n-- ) {
scanf( "%s",c );
BTree T2 = NULL;
for( int i=0 ; c[i] ; i++ ) {
s = c[i] - '0';
add( s,T2 );
}
printf( judge( T1,T2 )?"YES\n":"NO\n" );
}
}
}