中国大学MOOC浙大数据结构PTA课后题
在这里占个坑,记录一下学习数据结构中例题
目录
二叉树的同构
1.建树
2.判断是否为同构
3.同类型题目
是否同一棵二叉搜索树
思路
代码
二叉树的同构
题目:题目详情 - 03-树1 树的同构 (25 分) (pintia.cn)https://pintia.cn/problem-sets/1497448825169559552/problems/1503334324290916352
1.建树
首先理清题目意思,给出的每组数据中,仅仅表现了父节点的内容与子节点的编号的关系,无法确定根节点。
这里用结构体数组来储存树,根据数组的下标,则可确定当前节点的内容与孩子节点的位置。找到根节点的位置后,整棵树的架构便明确下来。
根节点的特殊之处在于,根节点是是无人指向的。
为了找出根节点,可以使用一个初值全为0的数组,若数组下标被指向,则反转为1。
2.判断是否为同构
设置一个递归函数(目的:判断两树是否同构),传入两棵树。
同构操作的实质是什么?我认为是交换左右子树。镜像对称的两树是同构的特殊情况,而同构是从上到下,逐渐深入,每次交换(或不交换)左右子树。
分情况进行递归的选择:
两树都为空:则一定是同构的。
只有一个是空的,或者根节点的元素不一样,一定不同构。
两个左子树都为空,则判断两右子树是否同构。(这里的左右不必纠结,也没有特殊性)
接下来判断根节点的左右节点,若左等于左,右等于右,则说明在这一步是相同的,接下来进行的操作是传入递归,比较分别比较两个左子树、两个右子树是否同构。若在根节点那一步,发生了左右交换,则比较左树的右子树和有树的左子树、左数的左和右数的右是否同构。
代码:
#include <iostream>
using namespace std;
#define maxsize 11
#define Null -1
typedef int Tree;
struct TNode {char data;Tree left,right;
}T1[maxsize], T2[maxsize];
Tree BuildTree(struct TNode T[]){int N,root;char l,r;bool isroot[maxsize];root = Null;scanf("%d", &N);if(N) {for(int i = 0; i < N; ++i) isroot[i] = true;getchar();for(int i = 0; i < N; ++i) {scanf("%c %c %c", &T[i].data, &l, &r);getchar();if(l != '-') {T[i].left = l -'0';isroot[T[i].left] = false;} else T[i].left = Null;if(r != '-') {T[i].right = r -'0';isroot[T[i].right] = false;} else T[i].right = Null;}for(int i = 0; i < N; ++i) if(isroot[i]) {root = i;break;}}return root;
}
bool judge(Tree R1, Tree R2) {if(R1 == Null && R2 == Null) return true; //两个都为空if((R1 == Null && R2 != Null) || (R1 != Null && R2 == Null))return false; //其中一个为空if(T1[R1].data != T2[R2].data)return false; //根节点元素就不一样//两个左子树都为空,则判断右子树是否同构if(T1[R1].left == Null && T2[R2].left == Null) return judge(T1[R1].right, T2[R2].right);//两个左子树都不为空且元素相同,不用交换if((T1[R1].left != Null) && (T2[R2].left != Null) && (T1[T1[R1].left].data == T2[T2[R2].left].data))return judge(T1[R1].left, T2[R2].left) && judge(T1[R1].right, T2[R2].right);else {//交换左右子树,判断return judge(T1[R1].left, T2[R2].right) && judge(T1[R1].right, T2[R2].left);}
}
int main() {Tree R1, R2;R1 = BuildTree(T1);R2 = BuildTree(T2);if(judge(R1, R2)) cout << "Yes" << endl;else cout << "No" << endl;return 0;
}
3.同类型题目
PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台https://pintia.cn/problem-sets/1497448825169559552
层次遍历——使用队列实现
首先根节点入队,执行循环
{
pop队列中队头的元素
判断此元素左右孩子是否为空,将其不空的左右孩子入队
}
是否同一棵二叉搜索树
题目详情 - 04-树4 是否同一棵二叉搜索树 (25 分) (pintia.cn)https://pintia.cn/problem-sets/1497448825169559552/problems/1505905647748263937
思路
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。
这里采取的方法是先根据第一行的输入建立一棵树T,再判断序列与树是否同源。
首先在书中寻找序列的某个元素,看寻找的路径中,是否有新出现的节点。(也就是说这个序列中,如果不事先知道这个节点的值的话,是不可能得到像T一般的树的)
因此需要设置标志,判断是否已经访问过了。
代码
#include <iostream>
using namespace std;
#define maxsize 11
typedef struct TNode* Tree;
struct TNode {int data;Tree left,right;int flag; //判断是否访问过
};void Clear(Tree R) { //清除标记if(!R) return;R->flag = 0;Clear(R->left);Clear(R->right);
}
void FreeTree(Tree R) { //清空该树if(!R) return;FreeTree(R->left);FreeTree(R->right);delete R;
}
Tree NewNode(int data) {//Tree R = new TNode;R->data = data;R->left = R->right = NULL;R->flag = 0;return R;
}
Tree BST_Insert(int data, Tree R) {if (!R) R = NewNode(data);else {if(data > R->data) //大于该结点,插入到右子树R->right = BST_Insert(data, R->right);else //小于或等于该结点,插入到左子树R->left = BST_Insert(data, R->left);}return R;
}
Tree Build(int N) {Tree R = NULL;int x;cin >> x;R = NewNode(x);for(int i = 1; i < N; ++i) {cin >> x;R = BST_Insert(x, R);}return R;
}
bool check(int data, Tree R) {if(R->flag) {//已经访问过了if(data < R->data) return check(data, R->left);else if(data > R->data) return check(data, R->right);else return false;} else {if(data == R->data) {R->flag = 1;return true;} else return false;}
}
bool judge(Tree R1, int N) {int x;bool flag = true;if(N && R1) {cin >> x;if(x != R1->data) flag = false;R1->flag = 1;for(int i = 1; i < N; ++i) {cin >> x;if(flag && (!check(x,R1))) flag = false;}}return flag;
}
int main() { int N, L;cin >> N;while(N) {cin >> L;Tree R1;R1 = Build(N);for(int i = 0; i < L; ++i) {if(judge(R1, N)) cout << "Yes" << endl;else cout << "No" << endl;Clear(R1); //清除标记} FreeTree(R1);cin >> N;}return 0;
}
中国大学MOOC浙大数据结构PTA课后题相关推荐
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...
- python中国大学慕课平台_中国大学MOOC(慕课)_Python程序设计_题库及答案
中国的性目标质和我国卫生发展试述事业. 压下在常,大学最高温度可达水的. )的以(传热进行方式,慕课对流传导传递辐射.人口然属具有性和自生物属性.2捣点小车上装置在A固车安装激光接收.包括地缘群体,党 ...
- 中国大学MOOC文学欣赏与批评题库及答案
选择题(搜题找答案就在优题宝) 1.下列不能反映<雨巷>中诗人内心的选项是: A.愉悦明朗 B.混沌迷惘 C.孤独寂寞 D.忧愁苦闷 2.卞之琳的<断章>主要反映了何种观点 A ...
- mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...
- 中国大学MOOC第10周编程题在线测试
1 数字字符串转换为整型数(4分) 题目内容:从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出. 函数原型为 int Myatoi(ch ...
- 中国大学MOOC第11周编程题在线测试
1 山地训练(4分) 题目内容:为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练.她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒 ...
- 中国大学MOOC哈工大C语言程序设计第9周编程题在线测试
中国大学MOOC哈工大C语言程序设计第9周编程题在线测试 1.重复数字检查(4分) 题目内容: 从键盘输入一个数,检查这个数中是否有重复出现的数字.如果这个数中有重复出现的数字,则显示"Re ...
- mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...
中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...
最新文章
- FPGA基础知识极简教程(9)七段数码管显示的Verilog简单设计
- 跑步机到了,看能坚持多久
- 计算机辅助制造与cnc,ComputerAided Manufacturing CNC (计算机辅助制造数控).pdf
- 钉钉小程序可以上传文件_怎样禁止钉钉外发文件?钉钉文件传输协议分析
- Ajax.BeginForm无法调用 ajaxOptions的js函数
- 30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码
- windows配置samba客户端_怎样设置Samba文件服务器以使用Windows客户端
- invalid LOC header(bad signature)错误及解决
- PHP5应用实例详解
- 在 Ubuntu 上配置高性能的 HHVM 环境
- model.compile
- 关机一直显示正在关闭服务器,电脑关机后,显示正在关机,但等半天也关不了 怎么办...
- 猿人学web端爬虫攻防大赛赛题解析_第九题:js混淆-动态cookie2
- 华纳云告知您,企业上云的十大优势
- python编程的缩进什么意思_编程缩进是什么意思
- go time包定时器和断续器
- PCA(Principal Components Analysis)
- 11g新增加的后台进程
- IDEA中用java实现简单记事本(保姆级)
- 渡一教育公开课web前端开发JavaScript精英课学习笔记(三)条件语句,循环语句