DS博客作业05--树

1.本周学习总结

1.1思维导图


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

树结构在实际应用中好像挺常见的,代码的思路可以整成树,例如修理牧场的问题也可以通过树来解决问题
树有多种储存结构,双亲存储,孩子链存储,孩子兄弟存储,可以根据得到的数据的特点来选择合适的存储结构
树种常见的树为二叉树,二叉树的前中后遍历分别可以用于处理不同类型的问题
由二叉树衍生出的线索二叉树,根据线索二叉树就能得到它的前后都是什么结点
哈夫曼树是用来求得最优解,并查集树可以用来判断是否属于同一集合

2.PTA实验作业

2.1.题目1:题目名称

根据后序和中序遍历输出先序遍历 

2.1.1设计思路

根据输入的中序序列和后序序列,先确定它的根节点的位置,用mid储存
BT->data=后序序列的最后一个元素
BT->lchild=递归调用建树函数,参数为后序序列的第一个元素,中序序列的第一个元素,次数为mid次,及k次
BT->rchild=递归调用建树函数,参数为后序序列的第mid个元素,中序序列的第mid-1个元素,次数为n-mid-1次,即n-k-1次

2.1.2代码截图

2.1.3提交列表说明

Q1:部分正确是因为把递归里面序列从哪个元素开始写错了,导致了三个测试点段错误
A1:后来重新看了一遍, 然后改了过来就对了

2.2 题目2

jmu-ds-输出二叉树每层节点

2.2.1设计思路

定义两个树的变量,一个为curNdoe,另一个为lastNode
定义一个树结构类型的队列q
定义int类型变量flag=1,level=1
curNode=lastNode=BT
如果树不空则将一个结点进队
while 队列不空
    取队首赋给curNode
    如果curNode有左孩子则进队
    如果有右孩子则进队
    如果 flag为1,输出层数level
    if curNode=lastNode,即curNode为下一层的最后一个元素
        将队列里的最后一个元素赋给lastNode(这样就考科一继续判断下一层什么时候是最后一个元素)
        flag=1
        输出curNode指向的data和回车
    else
        输出curNode指向的data
        flag=0;
    出队一个元素
end while

2.2.2代码截图


2.2.3提交列表说明

Q1:这题老师在上课时候已经给过思路了,但是那时的代码的格式和pta里要求的格式不一样,然后自己在做的时候,在控制格式的时候和卡壳了样,一直控制不好,然后第二天重新打的时候,一下子就想到了
A1:用一个flag就可以解决,我之前想着要控制层数和换行要分开控制,才搞了很久
Q2:然后第二个问题,是通过测试数据发现错在哪的,当左子树的层数比右子树的层数多就会出错,因为这时右子树的左右孩子都是空的,那么lastNode就不会等于下面那层的最后边的那个
A2:于是我有申请了一个tempNode,保存左边的子树,那么lastNode就会指向那层的最后一个元素了
Q3:但是这样做当只有一个根节点的时候,tempNode就会变成野指针
A3:在大佬的提点上,发现不用这么麻烦,只需要让lastNode等于对尾就可以了,不需要判断最后一个元素是在右子树还是左子树上了

2.3 题目3

修理牧场 

2.3.1设计思路

定义n和一个降序的优先队列q
定义长度为n的数组a,以及int型的变量 wpl=0
输入n
输入n个数,赋给数组a,以及进队q
while 队列的长度大于1
    定义min=取队顶,出队列
    定义pmin=取队顶,出队列
    将两个值相加,再进队
    wpl+=min+pmin
end while
输出wpl

2.3.2代码截图

2.3.3提交列表说明

Q1:看到题目第一个想法就是用哈夫曼树来处理,但是老师在上课讲过,这题用哈夫曼会超时,可以用容器优先队列来做
A1:发现用优先队列,进去的元素会自动排好,只要把前两个相加,在把和放进去,继续和里面的数比较,将比较小的两个数相加,就可以解决这个问题了,比构建哈夫曼树快多了
优先队列升序堆:priority_queue<int> qmax;
优先队列降序堆:priority_queue<int,vector<int>,greater<int> > qmin;

3 阅读代码

3.1 题目

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

3.2 解题思路

因为是二叉查找树,所以节点比左孩子小,比右孩子大,
使用递归的方法进行中序遍历,遍历的过程中将节点为第K小的元素,输出即可

3.3 代码截图

3.4 学习体会

这题利用了中序遍历的特点,轻松的输出了第K小的元素
得到的学习体会是,可以根据其特点,灵活的将他们运用在各种适用的问题上
posted @ 2019-05-19 02:38  Hyjjing  阅读(143)  评论(1编辑  收藏  举报