题目描述
如果T1可以通过若干次左右孩子互换变成T2,则我们称两棵树是“同构”的。
例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图一
图二
输入
第一行按照先序输入T1,其中空节点用 -1 表示。
第二行按照先序输入T2,其中空节点用 -1 表示。
输出
如果两棵树是同构的,输出"YES"。否则输出"NO".
样例输入
1 2 4 -1 -1 5 6 -1 -1 -1 3 7 8 -1 -1 -1 -1
1 3 7 -1 8 -1 -1 -1 2 5 6 -1 -1 -1 4 -1 -1
样例输出
YES
【注】cin.get()!='\n'可判断输入的是否是回车,而不限制输入的类型是char还是int.
//1310:同构二叉树(二叉树)
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
typedef struct BiNode{
int data;
struct BiNode *lchild;
struct BiNode *rchild;
}*BiTree;
//据先序序列创建二叉树
void CreateTree(BiTree &T){
int data;
scanf("%d",&data);
if(cin.get()!='\n'){
if(data==-1){
T=NULL;
}else{
T=(BiNode*)malloc(sizeof(BiNode));
T->data=data;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
}
//判断是否同构
int Judge(BiTree T1, BiTree T2) {
// 空树互为同构
if(T1==NULL && T2==NULL) return 1;
// 一个为空,一个不为空,不同构
if(T1==NULL || T2==NULL) return 0;
//在两棵树不为空树的情况下
return T1->data == T2->data &&
((Judge(T1->lchild, T2->lchild) && Judge(T1->rchild, T2->rchild))
||(Judge(T1->lchild, T2->rchild) && Judge(T1->rchild, T2->lchild)));
}
int main(void){
BiTree T1,T2;
//创建第一棵树
CreateTree(T1);
//创建第二棵树
CreateTree(T2);
//判断是否同构
if(Judge(T1,T2)==1)
printf("YES");
else printf("NO");
return 0;
}