首页 > 其他分享 >7-3 树的同构

7-3 树的同构

时间:2024-12-21 17:32:30浏览次数:6  
标签:同构 right r1 r2 int 结点 st

题目描述

7-3 树的同构

给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

fig1.jpg

图1

图2

现给定两棵树,请你判断它们是否是同构的。

输入格式:

输入给出2棵二叉树的信息。对于每棵树,首先在一行中给出一个非负整数 n (≤10),即该树的结点数(此时假设结点从 0 到 n−1 编号);随后 n 行,第 i 行对应编号第 i 个结点,给出该结点中存储的 1 个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出 “-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

输出格式:

如果两棵树是同构的,输出“Yes”,否则输出“No”。

样例示意

输入样例1(对应图1):

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 -

输出样例1:

Yes

 

题目分析

树的构建

题目中以结点编号为纽带,给出父结点和子结点之间的关系。

通过创建结点数组,储存该树中第i个结点t[i] 的data(A,B...),left左结点编号,right右结点编号,并约定结点为空记为-1。

同时设立st[ ]数组,保存结点是否作为别的结点的孩子结点出现过,约定false为不做孩子结点;true做了孩子节点。

通过st数组,帮助找到根结点root。

因为只有根结点不会作为别的结点的孩子结点,st数组值为false。

情况分类

两棵树是否同构的情况分类如下:

 

完整代码

#include <iostream>
#include <cstring>
using namespace std;
const int N = 10;
//结点结构
typedef struct Node {
	char data;
	int left;  //结点编号
	int right;
}Node;
Node t1[N], t2[N];  //两棵树结点情况
bool st[N];  //记录结点是否作为孩子结点,用于寻找根结点
//树的构建
int Build(Node t[]) {
	int n;
	int root = -1;
	memset(st, false, sizeof st);
	cin >> n;
	char cl, cr;
	for (int i = 0; i < n; i++) {
		cin >> t[i].data >> cl >> cr;
		//左孩子结点
		if (cl != '-') {
			t[i].left = cl - '0';  //左结点不为空,存储结点编号
			st[t[i].left] = true;  //st修改为true,该结点编号已作为孩子结点
		}
		else t[i].left = -1;  //否则,左结点为空,记为-1
		//右孩子结点
		if (cr != '-') {
			t[i].right = cr - '0';
			st[t[i].right] = true;
		}
		else t[i].right = -1;
	}
	//循环遍历,只有根结点不会作为别的结点的孩子结点,即st值为false
	for (int i = 0; i < n; i++)
		if (!st[i]) root = i;
	return root;
}
//同构的判断
bool Ismorphic(int r1, int r2) {
	if (r1 == -1 && r2 == -1)  //情况1:都为空
		return true;
	else if ((r1 == -1 && r2 != -1) || (r1 != -1 && r2 == -1))  //情况2:一个为空,一个不为空
		return false;
	else if (t1[r1].data != t2[r2].data)  //情况3:都不为空且数值不等
		return false;
	else if (t1[r1].left == -1 && t2[r2].left == -1)  //情况4:左子树都为空
		return Ismorphic(t1[r1].right, t2[r2].right);  //递归判断右子树
	else  //情况5:剩余一般情况 递归处理
		return (Ismorphic(t1[r1].left, t2[r2].left) && Ismorphic(t1[r1].right, t2[r2].right))   //左=左&右=右
		|| (Ismorphic(t1[r1].left, t2[r2].right) && Ismorphic(t1[r1].right, t2[r2].left));  //交换:左=右&右=左
}
int main() {
	int root1, root2;
	root1=Build(t1);
	root2=Build(t2);
	int res = Ismorphic(root1, root2);
	if (res) puts("Yes");  //同构
	else puts("No");  //非同构
	return 0;
}

 

 提交结果

标签:同构,right,r1,r2,int,结点,st
From: https://blog.csdn.net/fcc13461862452/article/details/144632691

相关文章

  • 抽象代数-10-环的同构与同态
    同构与同态基本定义设\(R\)和\(R'\)是两个环,\(f\)是\(R\)到\(R'\)的一个映射,如果\(\foralla,b\inR\),均有:\(f(a+b)=f(a)+f(b),f(ab)=f(a)f(b)\)则称\(f\)为从\(R\)到\(R'\)的同态映射分类若\(f\)为单射,称\(f\)为单同态,\(R≌f(R)\),称\(f\)将\(A\)同构嵌入到\(R'\......
  • 205. 同构字符串
      给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符......
  • 抽象代数-05-同态与同构
    同态与同构群的同态设\((G,\cdot)\)和\((G',\odot)\)是两个群,若存在映射\(f:G\toG'\)满足:\(\foralla,b\inG\),均有\[f(a\cdotb)=f(a)\odotf(b)\]则称\(f\)是\(G\)到\(G'\)的一个同态映射或简称同态。如果\(f\)是单射,则称\(f\)是单同态;如果\(f\)是满射,则称\(f\)是满......
  • nuxt3 同构渲染的数据请求问题
    同构渲染所谓同构渲染,就是服务端构建页面并且渲染成html之后返回客户端,这里面的问题在于,同构渲染是需要获取动态渲染,然后返回静态页面的。在服务端渲染前获得请求到的数据nuxt3官方推荐的方式是使用useFetch函数,相比于axios,它只会进行一次请求,不需要去区分服务端请求和客......
  • 1203-同构字符串
    同构字符串leetcode205题目大意:给定两个字符串,判断是否为同构的字符串,字符间的对应关系一样,例如paper于title解题思路:使用两个hashmap分别做映射,当新字符在两个map中出现了key但是value不是对应的那个字符的话,就返回false,否则返回trueclassSolution{publicboolean......
  • 105 判断图是否同构
    //105判断图是否同构.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/14/problem/600给你两张无向简单图,保证两张图的顶点数和边数相同,请判断这两张图是否同构。如果同构输出Yes,否则输出No。输入格式第一行两个整......
  • P3993 [BJOI2017] 同构 题解
    Description你有\(n\)个点,你可以在这\(n\)个点之间连无向边,两个点之间至多只能连一条边,也不允许连自环,问至多能连多少条边。但这个问题的答案显然是\(\frac{n(n-1)}{2}\)条。所以有一个额外的限制,要求这个图不存在非平凡的自同构。一个图\(G\)有非平凡的自同构定义为存......
  • 【模板】树同构([BJOI2015]树的同构)
    一段合法的括号序和一棵有根树唯一对应,具体而言,考虑生成括号序的过程,从根节点出发,遇到左括号就向下走一步,遇到右括号就向上走一步由于树上的一个节点可能有多个子节点,因此在不规定访问顺序的情况下,同一棵树有多种不同的括号序列点击查看代码#include<bits/stdc++.h>using......
  • 同构字符串
    题目:给定两个字符串s和t,判断它们是否是同构的。如果s中的字符可以按某种映射关系替换得到t,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自......
  • 树同构
    link树同构是树哈希与换根dp的结合。树哈希是哈希中的一个种类,这里先给出哈希函数:\[\operatorname{treehash}(u)=\sum\operatorname{xorshift}(\operatorname{treehash}(v))\]这里使用unsignedlonglong的自然溢出特性代替取模。我们设\(g[u]\)是以\(u\)为根的子......