1.本周学习总结

1.1思维导图

1.2学习体会

树的学习,让我意识到自己的不足,学习也越来越难以跟上老师的,可能是基础差吧,再加上学习树的时候赶上概率论考试,ACM省赛(我做志愿者,然后周末没了),复习,练习的也较少,觉得这部分学的很水。
树对于递归使用的比较多,能否熟练地使用递归是能否运用树的关键。

2.PTA实验作业

2.1题目一:二叉树叶子结点带权路径长度和

2.1.1设计思路

BTree CreatBTree(int i)
if i>str的长度-1 返回NULL//输入的字符串遍历完
if str[i]==‘#’ 返回NULL//遇到空结点
data = str[i]
左孩子递归
右孩子递归
void GetWpl(BTree BT, int &wpl, int h)
if 左右叶子结点为空
wpl=深度*当前data的值
递归访问左子树
递归访问右子树

2.1.2代码截图


2.1.3提交列表及说明

2.2题目二:修理牧场 (优先队列的使用)

2.2.1设计思路

建立从小到大的优先队列
数入队
while (队列长度大于1)//当队列长度为1的时候,队列中只剩下一个sum
取两个最小值出队
算sum
两最小值相加入队
end while
输出sum

2.2.2代码截图

2.2.3提交列表及说明

本题并不是在做的时候遇到阻碍,而是在做题过程中学到了一下东西,在课上讲完如果算WPL最小值后,范华同学在同我回宿舍的路上给我说了可以使用优先队列,这样使得题目非常简单,回去试了一下,果然。
在优先队列中,优先级高的元素先出队列。
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
差不多就是priority_queue<int, vector, greater >q;//优先队列,从小到大入栈自动排序
priority_queue<int, vector,less >q;//优先队列,从大到小入栈自动排序
其实,应该是出栈顺序有变,但都是排序嘛。

2.3题目三:中序输出度为1的结点

本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树中度为1的结点

2.3.1设计思路

if BT结点为空,返回
ifBT结点不空
递归遍历左孩子
判断度是否为1//左孩子空右孩子不空或左孩子不空右孩子空
是 输出
不是 end if
递归遍历右孩子
end if

2.3.2代码截图

2.3.3提交列表及说明


本题我改了好多次,但始终是过不了,为此,甚至在判断是否度为1的时候加了一层又一层的括号(一定是运算符优先级没学好)然后,还是不行,最终,发现是我输出时候把字符形式按%d输出的
应该是从本学期学数据结构开始使用C++,然后就忘了C的一些要注意的地方。

3.阅读代码

据说晓淞那里有省赛的题我就去偷来了……

3.1题目

3.2解题思路

和修理牧场的题目差不多,可以使用优先队列。
将所有的猫的weight全部放进一个使用小顶堆的优先队列q;
int sum=0;
while(q.size()!=1)
出队权值最小的两项并求和plus;
入队plus;
sum+=plus;
输出sum;

3.3代码截图

3.4学习体会

这种ACM的题目,说难吧,其实也不难(但对我来说确实很难),英语脑残的我可能看英语题目就要花好久时间来理解题目,这种题其次一点就是对数的处理,和PTA不一样,ACM的题往往要用庞大的数据去测试,正如晓淞的代码,对数据的定义都是long long ,再加上我平时写代码也总是丢三落四(上面PTA题目可证),写代码要戒骄戒躁。还有,优先队列真好用。