zoukankan      html  css  js  c++  java
  • 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)。
    在数组的帮助下解决了很多需要数据结构的问题。
    
  • 相关阅读:
    Softmax
    网络流模板大全
    简单数据结构题(from 钟子谦——IOI2018集训队自选题)
    [POJ3177]Redundant Paths
    [BZOJ1051][HAOI2006]受欢迎的牛
    [BZOJ2036]聪明的阿卑多
    [BZOJ1455]罗马游戏
    [POJ2942][LA3523]Knights of the Round Table
    [POJ3352]Road Construction
    练级(train)
  • 原文地址:https://www.cnblogs.com/tmacly/p/10887035.html
Copyright © 2011-2022 走看看