DS博客作业05--树
1.本周学习总结
1.思维导图

2.谈谈你对树结构的认识及学习体会
学完树之后,最大的感觉就是在处理节点之间的兄弟父亲关系的时候真的挺好用的,一目了然。不过,树令人比较头疼的就是要用递归,大致能懂递归怎么用,但是自己具体写起代码来就比较懵逼,不知道把递归语句放在哪里,对递归条件判断什么的概念也比较模糊。这次的目录树大作业,我是自己独立写了一些的,但是后面发现遇到了和老师之前说的问题一样的情况,就是建立起来的树是散的,并不是一棵完整的树。在和团队讨论之后,发现需要用指针把彼此之间兄弟的关系建立起来,不过,我们队这次用的是指针,多次循环找关系,没有巧妙地运用递归,代码量就增加了不少。
这次作业,最大的收获是学会了优先队列,降序队列代码:priority_queue<int>q 升序队列代码:priority_queue<int, vector<int>, greater<int> > q。利用已有的库函数等知识点,可以大大减少编程量,这个也涉及到堆的应用,这个又和容器相关联,发现容器还真是个好东西,以后要多应用应用!
2.PTA实验作业
2.1.题目1:表达式树
输入要求:输入一行字符串
输出要求:输出结算结果,如遇到除0,提示divide 0 error!
输入样例:1+2*3
输出样例:7
2.1.1设计思路
建树初始化函数:
让叶子节点放数字,其余放运算符。初始化树的代码中定义两个栈,一个存放字符,一个存放数字,str读入的是算式
- 当str数组不为空字符的时候,进行下面循环
(1)如果str[i]是数字,就让他为叶子节点,并且进数字栈
(2)如果str[i]是字符
- 如果栈为空,则直接进栈
- 否则就和字符栈栈顶元素比较
- 如果栈顶优先级更大,则出栈两个节点存于a,b中,将两个结点以及运算符构建二叉树,将建好的树进字符栈
- 如果栈顶优先级更小,则该字符进栈
- 如果两字符优先级相等,则栈顶元素出栈
(3)
- 如果栈中和运算符不为空,则继续出栈建树,进行下面循环
出栈两个节点存于a,b中,将两个结点以及运算符构建二叉树,将建好的树进字符栈
计算结果的函数:
- 将数字字符转化为十进制数字,number1,2分别存储两叶子节点数字
- 对两叶子节点的根进行判断
- 如果是加号:result+=number1+number2
- 如果是减号:result+=number1-number2
- 如果是乘号:result+=number1*number2
- 如果是除号:
- 如果number2=0,输出提示语并且退出程序
- 如果number2!=0,result+=number1/number2

2.1.2代码截图




2.1.3本题PTA提交列表说明

- Q1:第一次出现括号错误
- A1:我以为是计算结果个函数出了问题,于是定义了一个result存放结果
- Q2:后面发现错误一样,不是这个问题
- A2:于是我向同学拿代码过来对比一下,发现在初始化树那个函数中,我并没有建立起树的关系,导致后面计算结果那个函数无法进行树无法进行遍历
2.2 题目2:输出二叉树每层结点
输入格式:输入一行字符串。空节点用#表示。
输出格式:层次遍历二叉树,按照层次输出所在层及其包含节点,节点间要求,隔开,最后一个节点尾部带,。若二叉树为空,则输出NULL
输入样例:ABD#G###CEH###F#I##
输出样例:
1:A,
2:B,C,
3:D,E,F,
4:G,H,I,
2.2.1设计思路
这题我一开始想的是按老师方法,lastNode指针是指向队列最后一个一个元素的右孩子,可是注意到他可能没有右孩子或者没有孩子的情况比较麻烦,于是就放弃这个方法。后来我发现可以用队列,想的是curNode指针一直往后找,同时他的孩子入队,找到lastNode就全部出队,那样就需要两个队列,一个放当前行数,一个放下一层元素,而且双重循环,代码阅读性不好。
后来看到同学的,可以用一个队列,curNode孩子节点依次入队,lastNode为一开始队列最后的元素,curNode为队首元素,只要两指针不相等,元素就依次出队,相等则将lastNode改为队列最后的一个元素。只要队不空,就重复前面过程。

2.2.2代码截图



2.2.3本题PTA提交列表说明

比较奇怪的是,vs上分明出现了问题,但是交上去是答案正确,这个问题目前尚未解决,解决之后博主将更新博客说明原因

2.3 题目3:修理牧场
要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。
如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
输入格式:输入首先给出正整数N≤10000,表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度。
输出格式:输出一个整数,即将木头锯成N块的最少花费。
输入样例:
8
4 5 1 2 1 3 1 1
输出样例:
49
2.3.1设计思路
这题其实就是一个哈夫曼树,要使最后的花费最小,即是要生成一棵哈夫曼树。可以利用队列,每次选取最小的两个节点合成一棵树,由于这样要排序与合并,用数组就会比较麻烦。老师提示说可以用优先队列,其实就是一个堆的问题,放进一些无序的数进去,会自动排好序。
降序队列代码:priority_queue<int>q 升序队列代码:priority_queue<int, vector<int>, greater<int> > q
- 先让全部元素入队,优先队列会自动排好序
(1)队大小不为1的情况前两个元素出队,相加和存于cost中
(2)将cost放入队列中
(3)定义一个total记录最后总的费用,total每次自增cost
(4)队列大小不为1的情况下,cost重新置为1,再重复步骤(1)
(5)最后输出的total即所求的最小花费
2.3.2代码截图


2.3.3本题PTA提交列表说明

这题还比较顺利,由于老师有说过思路,就未犯什么错误
3、阅读代码
3.1 题目
本题为天梯赛试题,给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
9
2 6 5 5 -1 5 6 4 7
输出样例:
4
1 9
3.2 解题思路
家族人数其实就是一棵树对应的层层父亲兄弟孩子之间的关系,输入的N个节点对应的编号是其父母,由此可建成一棵树。而题目需要输出最小辈分即是层次遍历树,输出最后一层节点,也就需要用队列进行广度搜索。
3.3 代码截图


3.4 学习体会
- 看完这个代码发现根据父亲结点来建树会比给出先序序列那些逻辑性更强一些,这就需要建树的时候控制好他们之间的关系
- 利用广度遍历找到最小字辈,用到了vector,可很方便实现排序等功能
DS博客作业05--树的更多相关文章
- DS博客作业05——树
1.本周学习总结 1.1思维导图 1.2学习体会 学习:相比于之前的数据结构,树多了很多性质,相应的也多了很多计算题,不得不说,专有名词也是颇多.觉得树最独特的地方就是它的兄弟.孩子结点,用以组成了它 ...
- DS博客作业05—树
1.本周学习总结 1.1思维导图 1.2学习体会 本周学习了树的相关知识,了解了树结构体的应用和基本操作 学习了二叉树的遍历,创建以及哈夫曼树的相关操作 通过树的构建等操作熟练了递归的使用 2.PTA ...
- DS博客作业——树
DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...
- DS博客作业08--课程总结
DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...
- DS博客作业--07查找
目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...
- DS博客作业05--查找
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...
- DS博客作业04--图
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...
- DS博客作业03--树
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...
- C语言l博客作业05
问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9830 我在这 ...
- DS博客作业--课程总结
1.当初你是如何做出选择计算机专业的决定的? 经过一年学习,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 刚开始填报志愿的时候,因为我个人是没有什么比较特别 ...
随机推荐
- 洛谷 P2966 [USACO09DEC]牛收费路径Cow Toll Paths
题目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has ...
- centos7 python3 Saltstack配置
Python安装完毕后,提示找不到ssl模块 pip is configured with locations that require TLS/SSL, however the ssl module ...
- cocos2d-x之CCCardinalSplineBy
CCCardinalSplineBy概念 这个类是样条曲线动作,其创建函数CCCardinalSplineBy::create(float duration, cocos2d::CCPointArra ...
- cocos2d-x中的字符串操作
1:循环体中字符串的构造. 通常用于多个有规律的文件的名字,诸如:[NSString stringWithFormat:@"filed.png",i].我们可以通过spr ...
- Race condition
在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题.于是想来总结一下这些方法. Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺 ...
- Ubuntu 开机启动不执行
解决方案: 1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash" 2.将/bin/sh重新链接到/b ...
- vue里的数据
背景: 一个项目完工在即,鉴于此,前端使用了vue,写下此栏,以供日后翻阅, 会涉及到我所运用到的vue相关知识,需要一定的js基础. 默认vue的single-file-components(单文件 ...
- vue组件:canvas实现图片涂鸦功能
方案背景 需求 需要对图片进行标注,导出图片. 需要标注N多图片最后同时保存. 需要根据多边形区域数据(区域.颜色.名称)标注. 对应方案 用canvas实现涂鸦.圆形.矩形的绘制,最终生成图片bas ...
- verilog $fopen 函数的小缺陷
system task $fopen 的argument 为1.文件名字(可以包含具体的文件路径但是注意用)2.打开方式比如"r"."w"."a&qu ...
- APP客户端图片上传PHP接口
1.客户端 file_get_contents($_FILES['img']['tmp_name']) //获取临时目录下的上传文件流,加密传给接口 2.接口处理端 $img = file_get ...