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

图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
输入样例2(对应图2):
8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4
输出样例2:
No
思路:
1.使用数组来表示二叉树,数组元素是二叉树的每个节点Node。节点类由三个属性:节点值element,左孩子位置left,右孩子位置right
2.需要设计两个函数:1.建二叉树;2.同构判别
3.使用StreamTokenizer类获取屏幕输入,处理输入比Scanner类效率高
建树函数:
建立二叉树的同时,我们要找出根节点的位置。
从样例可知,除了根节点,其他每个节点的编号都会出现在左右孩子编号中。标记出现的编号,未被标记的则为根节点
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer; /**
* @author Ethan
* @date 2020/6/8
* 树的重构
*/
public class Main {
//记录根节点位置
static int root = -1; public static void main(String[] args) throws Exception {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); Node1[] nodes1 = buildTree(in);
int root1 = root;
Node1[] nodes2 = buildTree(in);
int root2 = root; if (isTg(root1, nodes1, root2, nodes2)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
} //判断同构方法
static boolean isTg(int root1, Node1[] a, int root2, Node1[] b) {
//两个树均为空
if (root1 == -1 && root2 == -1) {
return true; //树a为空或树a为空
} else if ((root1 == -1 && root2 != -1) || (root1 != -1 && root2 == -1)) {
return false; //两个数的根节点是否相同
} else if (!a[root1].element.equals(b[root2].element)) {
return false; //分别判断两个树的左儿子和右儿子是否相同
//如果相同,则将孩子节点作为根节点进行递归,一直到叶节点为止
} else if (isTg(a[root1].left, a, b[root2].left, b) &&
isTg(a[root1].right, a, b[root2].right, b)) {
return true; //判断树a左儿子和树b右儿子是否相同 树a右儿子和树b左儿子是否相同
//如果相同,则将孩子节点作为根节点进行递归,一直到叶节点为止
} else {
return isTg(a[root1].left, a, b[root2].right, b) &&
isTg(a[root1].right, a, b[root2].left, b);
} } //建树方法
static Node1[] buildTree(StreamTokenizer in) throws Exception { in.nextToken();
int n = (int) in.nval;
Node1[] tree = new Node1[n]; int[] check = new int[n];
for (int i = 0; i < n; i++) {
//设置标记,先将每个节点标记为 -1
//当节点编号出现在孩子节点编号时,将标记设为1
check[i]=-1;
}
for (int i = 0; i < n; i++) {
tree[i] = new Node1();
in.nextToken();
//读取元素值
tree[i].element = in.sval; in.nextToken();
//读取左孩子编号
//ttype = -2时,说明为数字
if (in.ttype == -2) {
tree[i].left = (int) in.nval;
//当节点编号出现在孩子节点编号时,将标记设为1
check[tree[i].left] = 1;
} else {
//当孩子节点编号为空时,标记为 -1
tree[i].left = -1;
} in.nextToken();
//读取右孩子编号
if (in.ttype == -2) {
tree[i].right = (int) in.nval;
check[tree[i].right] = tree[i].right;
} else {
tree[i].right = -1;
}
} //找出根节点:未在孩子编号中出现的节点编号为根节点
for (int i = 0; i < n; i++) {
if (check[i] == -1) {
root = i;
break;
}
} return tree;
} }
//节点类
class Node1 {
String element;
int left;
int right;
}
7-3 树的同构(25 分) JAVA的更多相关文章
- PTA 03-树1 树的同构   (25分)
		题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/711 5-3 树的同构 (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右 ... 
- PTA 树的同构 (25分)
		PTA 树的同构 (25分) 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号):随后N行,第i行对应编号第 ... 
- PAT 03-树1 树的同构   (25分)
		给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后 ... 
- PTA 7-3 树的遍历 (25分)
		PTA 7-3 树的遍历 (25分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点 ... 
- 7-4 是否同一棵二叉搜索树 (25分)  JAVA
		给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到. 例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结 ... 
- 7-4 List Leaves (25分) JAVA
		Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ... 
- PTA  深入虎穴 (正解)和树的同构
		在上一篇博客中分享了尝试用单链表修改程序,虽然在Dev上运行没有错误,但是PTA设置的测试点有几个没有通过,具体不清楚问题出现在哪里,所以现在把之前正确的程序放在这里. 7-2 深入虎穴 (30 分) ... 
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
		题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ... 
- 03-树1 树的同构(25 point(s)) 【Tree】
		03-树1 树的同构(25 point(s)) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为 ... 
随机推荐
- mysql去重复关键字distinct的用法
			distinct的去重复的提前是表中所有列的数据完成相同时,才能把相同的数据只保留一条,并不是 distinct 列名,除去某一列相同的数据,并且 distinct要放在第一个列前面.案例如下:一个学 ... 
- python pexpect总结
			基本使用流程 pexpect 的使用说来说去,就是围绕3个关键命令做操作: 首先用 spawn 来执行一个程序 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的 ... 
- Jmeter(五) - 从入门到精通 - 创建网络计划实战和创建高级Web测试计划(详解教程)
			1.简介 上一篇中宏哥已经将其的理论知识介绍了一下,这一篇宏哥就带着大家一步一步的把上一篇介绍的理论知识实践一下,然后再说一下如何创建高级web测试计划. 2.网络计划实战 通过上一篇的学习,宏哥将其 ... 
- 如何减小SRAM读写操作时的串扰
			静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ... 
- itext7史上最全实战总结
			1. itext7史上最全实战总结 1.1. 前言 最近有个需求需要我用Java手动写一份PDF报告,经过考察几种pdf开源代码,最终选取了itext7,此版本为7.1.11,由于发现网上关于该工具的 ... 
- jchdl - GSL实例 - MulC2(有符号数的乘法)
			这里的实现,先把符号位取出来,使用两个正数相乘,然后在把符号加到乘积上. 参考链接 https://github.com/wjcdx/jchdl/blob/master/src/org/jch ... 
- Linux kernel学习(序)
			伟大的Linux kernel有几大重要模块: 1.文件系统(File System) 2.进程调度(Process Scheduler) 3.内存管理(Memory Management) 4.进程 ... 
- Java实现蓝桥杯模拟元音单词的验证
			问题描述 小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音 ... 
- Java实现 LeetCode 199 二叉树的右视图
			199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, ... 
- python3 基本书写规范
			一.缩进在类.函数定义完成后需要接着写子代码快需要在定义完成后加上: 缩进格式为首字母开始空格4个位置(取消了大括号以冒号代替子模块)例: class pop: #类的定义方式 def pip: #函 ... 
