在这里占个坑,记录一下学习数据结构中例题

目录

二叉树的同构

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课后题相关推荐

  1. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...

  2. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...

  3. python中国大学慕课平台_中国大学MOOC(慕课)_Python程序设计_题库及答案

    中国的性目标质和我国卫生发展试述事业. 压下在常,大学最高温度可达水的. )的以(传热进行方式,慕课对流传导传递辐射.人口然属具有性和自生物属性.2捣点小车上装置在A固车安装激光接收.包括地缘群体,党 ...

  4. 中国大学MOOC文学欣赏与批评题库及答案

    选择题(搜题找答案就在优题宝) 1.下列不能反映<雨巷>中诗人内心的选项是: A.愉悦明朗 B.混沌迷惘 C.孤独寂寞 D.忧愁苦闷 2.卞之琳的<断章>主要反映了何种观点 A ...

  5. mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  6. 中国大学MOOC第10周编程题在线测试

    1 数字字符串转换为整型数(4分) 题目内容:从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出. 函数原型为 int Myatoi(ch ...

  7. 中国大学MOOC第11周编程题在线测试

    1 山地训练(4分) 题目内容:为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练.她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒 ...

  8. 中国大学MOOC哈工大C语言程序设计第9周编程题在线测试

    中国大学MOOC哈工大C语言程序设计第9周编程题在线测试 1.重复数字检查(4分) 题目内容: 从键盘输入一个数,检查这个数中是否有重复出现的数字.如果这个数中有重复出现的数字,则显示"Re ...

  9. mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...

    中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...

最新文章

  1. FPGA基础知识极简教程(9)七段数码管显示的Verilog简单设计
  2. 跑步机到了,看能坚持多久
  3. 计算机辅助制造与cnc,ComputerAided Manufacturing CNC (计算机辅助制造数控).pdf
  4. 钉钉小程序可以上传文件_怎样禁止钉钉外发文件?钉钉文件传输协议分析
  5. Ajax.BeginForm无法调用 ajaxOptions的js函数
  6. 30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码
  7. windows配置samba客户端_怎样设置Samba文件服务器以使用Windows客户端
  8. invalid LOC header(bad signature)错误及解决
  9. PHP5应用实例详解
  10. 在 Ubuntu 上配置高性能的 HHVM 环境
  11. model.compile
  12. 关机一直显示正在关闭服务器,电脑关机后,显示正在关机,但等半天也关不了 怎么办...
  13. 猿人学web端爬虫攻防大赛赛题解析_第九题:js混淆-动态cookie2
  14. 华纳云告知您,企业上云的十大优势
  15. python编程的缩进什么意思_编程缩进是什么意思
  16. go time包定时器和断续器
  17. PCA(Principal Components Analysis)
  18. 11g新增加的后台进程
  19. IDEA中用java实现简单记事本(保姆级)
  20. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三)条件语句,循环语句

热门文章

  1. Python源码学习(三)
  2. 我应该使用哪个版本的 JDK?
  3. rsa私钥和公钥_如何创建RSA公钥和私钥?
  4. Python之正则表达式小练
  5. javascript 实现一小时倒计时计时器
  6. 手机访问网站,点击手机号码直接拨打电话
  7. 《上瘾》01| 如何让用户养成习惯和行动及案例分析
  8. 基于BIM(Revit平台)的铝合金模板设计软件的研发
  9. 短时记忆想要变成长时记忆,是需要专门付出努力的,关联越多,越能记住
  10. 最佳引脚使用 – ESP8266 ESP12S