找B的跟节点和A的跟节点一样的点,在遍历左右子树,如果都相同则返回true,否则继续寻找
#include<cstdio>
#include<cstring>
typedef struct node
{
int val;
struct node *left;
struct node *right;
void setVal(int v)
{
this->val = v;
left = right = NULL;
}
}Tree;
int n,m;
void createTree(int n,Tree tree[])
{
int val,childIndex;
if(n == 0)
return;
for(int i=0;i<n;++i)
{
scanf("%d",&val);
tree[i].setVal(val);
}
for(int i=0;i<n;++i)
{
scanf("%d",&val);
if(val == 1)
{
scanf("%d",&childIndex);
tree[i].left = &tree[childIndex-1];
}
else if(val == 2)
{
scanf("%d",&childIndex);
tree[i].left = &tree[childIndex-1];
scanf("%d",&childIndex);
tree[i].right = &tree[childIndex-1];
}
}
}
bool isSubTree(Tree *aTree,Tree*bTree)
{
if(bTree == NULL)
return true;
if(aTree == NULL)
return false;
if(aTree->val != bTree->val)
return false;
return isSubTree(aTree->left,bTree->left) && isSubTree(aTree->right,bTree->right);
}
bool checkSubTree(Tree *aTree,Tree *bTree)
{
bool is = false;
if(aTree != NULL && bTree != NULL)
{
if(aTree->val == bTree->val)
{
is = isSubTree(aTree,bTree);
}
if(!is && aTree->left != NULL)
{
is = checkSubTree(aTree->left,bTree);
}
if(!is && aTree->right != NULL)
{
is = checkSubTree(aTree->right,bTree);
}
}
return is;
}
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
Tree aTree[1009],bTree[1009];
createTree(n,aTree);
createTree(m,bTree);
if(n <= 0 || m <= 0)
{
printf("NO\n");
continue;
}
if(checkSubTree(aTree,bTree))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}