主要知识点
1.根据输入格式建树,由于数据比较少,可以不适用传统的指针建树,可以建立静态的树,以下标作为查找。
2.比较两棵树是否是异构树,使用递归的方式。在leetcode上面有类似的题,是比较两棵树是否是相同的树,这里异构的树稍微扩展了一下。
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cctype>
#include <unordered_map>
#include <map>
#include <cstring>
using namespace std;
const int N = 30;
struct tree{
char val;
int l, r;
}E[N], F[N];
int ind[30];
void pre(int r){
if(r == -1) return;
cout<<E[r].val<<" ";
pre(E[r].l);
pre(E[r].r);
}
void pres(int r){
if(r == -1) return;
cout<<F[r].val<<" ";
pres(F[r].l);
pres(F[r].r);
}
bool issame(int r1, int r2){
if(r1==-1 || r2 == -1) return r1 == r2;
if(E[r1].val != F[r2].val) return false;
if(E[E[r1].l].val == F[F[r2].l].val)
return issame(E[r1].r, F[r2].r);
else
return issame(E[r1].l, F[r2].r)&& issame(E[r1].r, F[r2].l);
}
int main(){
int n, m;
//第一棵
cin>>n;
char c;
string str1, str2;
for(int i = 0; i < n; i++){
cin>>E[i].val>>str1>>str2;
if(str1[0] != '-') {
ind[stoi(str1)]++;
E[i].l = stoi(str1);
}else
E[i].l = -1;
if(str2[0] != '-') {
ind[stoi(str2)]++;
E[i].r = stoi(str2);
}else
E[i].r = -1;
}
int rt1=555, rt2=555;
for(int i = 0; i < n; i++){
if(!ind[i]){
rt1 = i;
break;
}
}
//第二棵
memset(ind, 0, sizeof(ind));
cin>>m;
for(int i = 0; i < m; i++){
cin>>F[i].val>>str1>>str2;
if(str1[0] != '-') {
ind[stoi(str1)]++;
F[i].l = stoi(str1);
}else
F[i].l = -1;
if(str2[0] != '-') {
ind[stoi(str2)]++;
F[i].r = stoi(str2);
}else
F[i].r = -1;
}
for(int i = 0; i < m; i++){
if(!ind[i]){
rt2 = i;
break;
}
}
if((rt1==555 && rt2==555)||issame(rt1, rt2)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}