zoukankan      html  css  js  c++  java
  • DS博客作业05--树

    DS博客作业05--树

    1.本周学习总结

    1.思维导图

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

        树就是非线性数据结构
        我觉得最难得还是对于递归的理解与应用吧,同样的一个目标比如,遍历树,如果用非递归来做的话
    代码量很多但是如果用递归的方法来计算的话,就只需短短几行。递归的确具有很高的简洁与高效性。
        
    

    2.PTA实验作业

    2.1题目1:6-4 jmu-ds-表达式树

        输入一行中缀表达式,转换一颗二叉表达式树,并求解.
    表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。
     转换二叉树如下:
    ![](https://img2018.cnblogs.com/blog/1474675/201905/1474675-20190524223551878-1917624259.png)
    
    

    2.1.1设计思路(伪代码)

    建表达式二叉树
    建op栈,op.push('#')
    初始化根节点栈:stacktree栈
    while(表达式未结束)
          if(ch==操作数)
                then 生成一个只有根结点的子树T   stacktree.push(T)
          if(ch==运算符)
                then 
                     while(ch<op栈顶运算符)  栈顶优先级高,则
                             创建一个树结点T,数据为op.top()
                             stacktree弹出2个根结点T1,T2
                             T->lchild=T1,T->rchild=T2
                             stacktree.push(T)
                             if(ch>op顶运算符) op.push(ch)
                             if(ch==op顶运算符)  则op.pop()
    
    计算表达式树
    double sum=0
    if(T不为空)
         then
             if(左右子树不为空)
                   then 返回对应数值
             递归左右子树得到a,b
             switch(结点值)
                   case +:计算并返回a+b
                   case - :  计算并返回a-b
                   case * :  计算并返回a*b
                   case / : 
                          if(除数为0)
                               then 直接输出错误并退出
                               else  计算并返回a/b
    

    2.1.2代码截图




    2.1.3本题PTA提交列表说明


    Q:没有考虑括号两个括号相遇时要出栈

    2.2题目1:修理牧场

        农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L​i的总和。
    但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次
    锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
    请编写程序帮助农夫计算将木头锯成N块的最少花费。
    

    2.2.1设计思路(伪代码)

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

    2.2.2代码截图

    2.2.3本题PTA提交列表说明

        Q:考虑q.size()的范围时出错,导致结果错了
    

    2.3.题目1:6-2 中序输出度为1的结点

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

    2.3.1设计思路(伪代码)

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

    2.3.2代码截图

    2.3.3本题PTA提交列表说明

        这题其实没什么大问题,就是学了c++会容易遗忘以前c的注意点,然后再编译器里疯狂找错误
    

    3.阅读代码

    3.1 题目

        给出一串数字,然后判断是不是先增后减
    

    3.2 解题思路

        两个变量交替,flag判断开始是否是上升,如果不是,那么就不成立,
    up=1代表现在是上升区段,反之,递减区段,ans记录段数
    

    3.3 代码截图

    3.4 学习体

        巧妙运用flag来控制增减,然后用if来做比较
    
  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/B-hai/p/10884734.html
Copyright © 2011-2022 走看看