7-3 树的同构 (25 分)

主要知识点
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值