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来做比较
    
  • 相关阅读:
    模块和包
    mysql视图、存储过程等
    mysql 索引
    sql语句
    HTTP协议
    Django中的form组件
    数据结构
    一些常用函数
    C/C++中tag和type
    什么是compile-time-constant
  • 原文地址:https://www.cnblogs.com/B-hai/p/10884734.html
Copyright © 2011-2022 走看看