DS博客作业05--树

1.本周学习总结

1.思维导图

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

通过了对树结构的学习,更深刻的认识了递归的方法。学生   感觉树很有趣,但有时自己会犯迷糊,可能是因为自己的想象能力不足 。
感觉画图对于树结构的学习起着非常重要的作用 ,通过画图对树的题目解决有着很好的帮助。我发现其实最主要的就是二叉树,
因为不管是树还是森林,都可以转换成二叉树。所以二叉树的定义显得尤为重要,代码感觉难度又加大了,很多地方要结合栈队列的
运用,脑壳有点晕。还是得继续加油啊。

2.PTA实验作业

2.1.题目1:6-3 求二叉树高度 (20 分)

2.1.1设计思路(伪代码)

if(非空树)
设变量lt rt 储存左树右树的高度
lt=递归函数
rt=递归函数
if(lt>rt)
返回lt自增
else
返回rt自增

2.1.2代码截图

2.1.3本题PTA提交列表说明。


Q1 只有输出空树正确,其实就是基本全错
A1 重新敲思路
Q2 只有左树可以
A2 不小心写错了 rt++x写成++rt

2.2.题目2:6-4 jmu-ds-表达式树 (25 分)

2.2.1设计思路(伪代码)

for(int i=0;str[i];i++){
if(字符是数字)创建树节点并且入栈
else
{
if(字符栈栈顶优先级小于str[i]){
则进栈字符栈
}
else if(字符栈栈顶优先级大于str[i]){
出栈并且从节点栈中拿出两个;
构树并且放回节点栈中
}
else{
直接出栈
![](https://img2018.cnblogs.com/blog/1476345/201905/1476345-20190521205459888-788383527.png)

}
}
计算表达式
{
if(BT->rchild==NULL&&BT->lchild==NULL)
return BT->data-'0'
else{
a=计算遍历右树
b=计算遍历左树
switch()
{
case '+':return a+b;
case  '-':return a-b
case '*':returna*b
case '/':return a/b
}
}

2.2.2代码截图


2.2.3本题PTA提交列表说明。

Q1:忘了是函数题,把全部代码输入PTA,导致编译错误。
A1:重新复制。
Q2:未考虑除数为0的情况,导致部分错误。
A2:在遇到除号时设计判断函数,除数为0时输出相应字符串。

2.3 题目3 7-1 还原二叉树 (25 分)

2.3.1设计思路

int DFS(char a[],char b[],int n)
    if结点个数非法
        返回 0;
    for  i=0  to n
        if数组a和数组b中的字符相等
            break;
    左子树高度x=DFS(a+1,b,i)+1;
    右子树高度y=DFS(a+i+1,b+i+1,n-i-1)+1;
    if x大于y
        返回 x;
    else 
        返回 y;

2.3.2代码截图

2.3.3本题PTA提交列表说明。

非常令我后怕的一段提交记录,因为是这次作业第一题编程题,很多地方一直出问题,出了很多问题,记得最清楚的就是
cretree函数里面那几个数字,真的想了好久,改了好多次,有时候SAMPLE过了其他也过不了。

3.阅读代码

3.1 题目

集合A比较与集合B的交集

3.2 解题思路

将要比较的集合传入函数,另一个是用来返回状态的类型//(用于判断contains)
获得当前对象的所有函数
定义r=0,用来遍历元素,定义w=0,用来标记两个集合公共元素的个数
定义状态为false,用来返回是否有交集的状态
遍历A集合
    判断B集合中是否包含集合A中的当前元素//(用contains的判断,如果返回true则有包含集合B)
        if 包含则直接保存
            将数值复制给数组,让w++
if r的值比size小//(contains抛出错误)
    复制剩余的元素
        调用system.arrraycopy(第一个参数为源数组,第二个参数为源数组要复制的起始位置,第三个参数为目的数组,第四个参数为目的数组放置的起始位置,最后一个参数为复制的长度)
            w为当前集合A的长度
end if
if 集合A的大小发生变化//(w不等于size,即有交集)
    遍历交集里的元素
        将null赋值给元素
    记录集合中元素的改变
    设置当前数组的大小//size=w;
    状态改为true
end if
返回状态

3.3 代码截图

3.4 学习体会


这个源代码调用了一些其他函数,例如contains和arraycopy,百度了一下了解了一下。
发现很多步骤都有已经写好的函数可以调用,只要知道它怎么传参。
清除的这个步骤,它没有用移动数组来清除,而是直接将null赋值给它了
在判断集合A是否包含集合B时,不是用两重遍历来判断,而是调用了函数来实现,时间复杂度为O(n)。
在数组的帮助下解决了很多需要数据结构的问题。

posted on 2019-05-18 20:50  Miracly  阅读(138)  评论(0编辑  收藏  举报