DS博客作业05--树

1.本周学习总结

1.思维导图

2.谈谈你对树结构的认识及学习体会。

树是一种很有意思的结构,但学起来却并不容易,其中最大的难点就是树的很多操作都要用到递归来实现,而我之前几乎都没怎么用过递归(设计和调试都有点麻烦,特别是调试时跟程序走了半天终于找到了问题所在,却忘了走到了那一层了),但经过这一段时间的学习之后我也开始能够熟练的使用递归了,尽管递归存在之前所说的问题,但递归使用起来也特别的方便,仅靠短短几行的代码就能实现非递归几十行代码也不一定能实现的代码。想学好树学好递归也是重中之重。

2.PTA实验作业

2.1.题目1:jmu-ds-输出二叉树每层节点

层次遍历树中所有节点。输出每层树节点。

2.1.1设计思路

ErgodicBtree函数:
若树为空则输出NULL并返回
定义队列qu
定义整形变量i,j,h,flag 
将树根节点入队列
i=j=0,h=flag=1;
while(队列不为空)
	if(flag)
	 	输出h(层数)及':'
		flag=0;
	end if
	将队首出队并输出同时将此节点的孩子入队列
	每入队一次j++(记录下一层的节点数量)
	i--;
	if(i==0)//当前层次的节点已经全部输出
		h++;//(下一层次) 
		i=j,j=0;
		flag=1;
	end if
end while

2.1.2代码截图


2.1.3本题PTA提交列表说明。


这道题并不难,但老师上课讲的思路我不是很能理解,所以这道题我用的是自己的思路来解的

2.2 题目2:修理牧场

2.2.1设计思路

这道题考就是哈夫曼树的建立,但单纯解这一道题其实也不用把树建立起来。本题我是借助优先队列来解的

//定义优先队列q
priority_queue<int, vector<int>, greater<int>> q;
//由于优先队列默认降序,而本题要用到升序的优先队列,所以定义必须如上定义
定义变量n,s 
输入n 
输入每块木头的长度并入队列
for i=1 to n-1 
每次出队两个元素并相加,再将相加后值入队
s+=两元素相加后的值
end for
输出s 

2.2.2代码截图

2.2.3本题PTA提交列表说明。


本题用优先队列做很简单,就是将优先队列由降序改为升序(我查了半天的资料才知道要怎么改)

2.3 题目3:朋友圈

2.3.1设计思路

定义全局数组circle[30001]
int main()
{
	输入n,m 
	初始化circle
	for i=0 to m
		输入k 
		输入每一个圈子的成员并以第一个成员为boss
	end for
	max=0
	for i=1 to n
		j=i的boss
		flag[j]++;
		if(flag[j]>max)max=flag[j];
	end for
	输出max 
} 
int find(int x)//寻找x的boss
{
	if(circle[x]==x)return x;//找到boss时返回 
	else return circle[x] = find(circle[x]);//递归寻找x的boss并更改circle的值 
} 
void merge(int x, int y)//合并朋友圈 
{
	寻找x的boss
	寻找y的boss 
	若x和y的boss不一样,则让x的boss成为y的boss的boss 
} 

2.3.2代码截图

2.3.3本题PTA提交列表说明。


并查集的基础操作

3.阅读代码

3.1 题目

这次比赛刚好有遇到一道哈夫曼树的题目(虽然我看了半天才看出来是哈夫曼树),就拿出来说一下把
Description

It is known that there are N cats in Quasrain's home. The weight of cat i is A[i]. As Quasrain is evil, he wants to do something to the cats.
Practicing for two years and a half, the cats have gotten the commands of Quasrain. Whenever Quasrain say a a color, the cats in the actual color would come out, and Quasrain would cost sum of their weight. For example, now Quasrain has three cats in red, weights of {1,2,3}, and two cats in green, weights of {7,8} .If he says red, he would cost 6 (green for 15). Then he would choose some of them, would never stop until there isn't any pair of cats with the same color.
Initially, the cats are all in color white. Quasrain want to know, how much he wanld cost at least.

Input

The first line is a number N(2<=N<=10^5)
Then one line with N numbers, A[i] for the weight of cats i.(1<=A[i]<=10^9)

Output

Only one number, representing the least cost of Quasrain.

Sample
Input:

4
6 7 70 25

Output:

159

3.2 解题思路

这道题并不难,只要看出是哈夫曼树类型的题目,但题目本身和测试数据却带有很大的误导性,让我一直以为是把数据全部加起来,然后每次减去最大值并累和,之后就一直过不去,直到我意识到这道题是要用哈夫曼树来做,具体的解题思路其实和pta的修理牧场差不多

3.3 代码截图


(其实就是修理牧场的代码,只不过把数据类型由int改为了long)

3.4 学习体会

做这道题最重要的是要理解题目的真正含义,知道要用哈夫曼树来解,但在比赛的时候意识到这一点的时候还是太晚了,浪费了很多不必要的时间。。。

posted @ 2019-05-16 22:29  xingkyh  阅读(259)  评论(0编辑  收藏  举报