九度1820
テストケースは穴があいている.
#include<stdio.h>
#include<iostream>
typedef struct binarytree{
int m_nValue;
binarytree *m_pLeft;
binarytree *m_pRight;
}BinaryTree;
void CreateTree(BinaryTree *data[1002], int num);
bool SearchBfromA(BinaryTree *TreeA, BinaryTree *TreeB);
bool DoesAhaveB(BinaryTree *A, BinaryTree *B);
int main(){
int m;
int n;
BinaryTree *TreeStructureA[1002];
BinaryTree *TreeStructureB[1002];
while(scanf("%d %d", &n, &m) != EOF){
if( n < 0 || m <0 ){
//printf("NO
");
continue;
}
if( n == 0 && m == 0){
printf("NO
");// 3
continue;
}
if( n != 0 && m == 0){
printf("NO
");
continue;
}
if( n == 0 && m != 0){
// printf("NO
");// 4
continue;
}
CreateTree(TreeStructureA, n);
CreateTree(TreeStructureB, m);
if(SearchBfromA(TreeStructureA[0], TreeStructureB[0])){
printf("YES
");
}else{
printf("NO
");
}
}
return 0;
}
void CreateTree(BinaryTree *data[1002], int n){
if(n <= 0){
return;
}
int datatmp;
int datal,datar;
int k;
int i;
for(i=0; i<n; i++){
scanf("%d", &datatmp);
data[i] = new BinaryTree();
data[i]->m_nValue = datatmp;
}
for(i=0; i<n; i++){
scanf("%d",&k);
if(k == 2){
scanf("%d %d", &datal, &datar);
data[i]->m_pLeft = data[datal-1];
data[i]->m_pRight = data[datar-1];
}else if(k == 1){
scanf("%d", &datal);
data[i]->m_pLeft = data[datal-1];
data[i]->m_pRight = NULL;
}else if(k == 0){
data[i]->m_pLeft = NULL;
data[i]->m_pRight = NULL;
}
}
}
bool SearchBfromA(BinaryTree *TreeA, BinaryTree *TreeB){
bool result = false;
if(TreeA != NULL && TreeB != NULL){
if(TreeA->m_nValue == TreeB->m_nValue){
result = DoesAhaveB(TreeA, TreeB);
}
if(!result){
result = SearchBfromA(TreeA->m_pLeft, TreeB);
}
if(!result){
result = SearchBfromA(TreeA->m_pRight, TreeB);
}
}
return result;
}
bool DoesAhaveB(BinaryTree *A, BinaryTree *B){
if(B == NULL && A != NULL){
return true;
}
if(A == NULL && B != NULL){
return false;
}
if(A == NULL && B == NULL){
return true;
}
if(A->m_nValue != B->m_nValue){
return false;
}
return DoesAhaveB(A->m_pLeft, B->m_pLeft) && DoesAhaveB(A->m_pRight,B->m_pRight);
}