数据结构实验之二叉树一:树的同构
Description
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。
图1
图2
现给定两棵树,请你判断它们是否是同构的。
Input
输入数据包含多组,每组数据给出
2
棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数
N (
≤
10)
,即该树的结点数(此时假设结点从
0
到
N−1
编号);随后
N
行,第
i
行对应编号第
i
个结点,给出该结点中存储的
1
个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出
”-”
。给出的数据间用一个空格分隔。
注意:题目保证每个结点中存储的字母是不同的。
注意:题目保证每个结点中存储的字母是不同的。
Output
如果两棵树是同构的,输出“
Yes
”,否则输出“
No
”。
Sample
Input
8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A 5 1 H - - C 0 - D - - E 2 -
Output
Yes
Hint
测试数据对应图1
#include<iostream>
using namespace std;
//树的节点
struct BiTNode{
char data;
int lchild, rchild;
};
//定义两棵树
BiTNode T1[11],T2[11];
/***
*判断相等的函数
*
*思想:
- 有两种结果:
-相等
- 不相等。
* - 只看相等, 有两种情况:
①存再空树:
两颗树都为空才相等
②不存在空树:
根相等 并且(r1左树等于r2左,r1右树等于r右树 或者 r1左等于r2右 r2右等于r1左) <--递归
- 其他情况都是不相等
*/
bool isEqual(int root1, int root2){
if(root1 == -1 && root2 == -1){
return true;
}else if(root1 !=-1 && root2 != -1
&&T1[root1].data == T2[root2].data
&&((isEqual(T1[root1].lchild,T2[root2].lchild)&&isEqual(T1[root1].rchild, T2[root2].rchild))||(isEqual(T1[root1].lchild,T2[root2].rchild)&&isEqual(T1[root1].rchild, T2[root2].lchild)))){
return true;
}
return false;
}
/**
*创建树的函数
*返回:树根的位置
*/
int build(int n, BiTNode T[]){
bool mark[11];
char buff[2];
int num;
fill(mark,mark+11, false);
for(int i = 0;i < n;i++){
cin>>buff;
T[i].data = buff[0];
cin>>buff;
if(buff[0] == '-'){
T[i].lchild = -1;
}else{
num = buff[0] - '0';
T[i].lchild = num;
mark[num] = true;
}
cin>>buff;
if(buff[0] == '-'){
T[i].rchild = -1;
}else{
num = buff[0] - '0';
T[i].rchild = num;
mark[num] = true;
}
}
//找根
for(int i = 0;i < n;i++){
if(!mark[i])return i;
}
//空树
return -1;
}
int main(){
int n, m;
int root1, root2;
while(cin>>n){
root1 = build(n,T1);
cin>>m;
root2 = build(m, T2);
int eq = isEqual(root1, root2);
if(eq){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}