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

    DS博客作业05-树

    1.本周学习总结

    1.思维导图

    2.学习体会

         对于这章,我感觉在课前预习时,看书做课堂派觉得自己挺懂,老师上课讲的也大概能理解,但一到做题就不知所措,很迷茫,然后很多题也不会做。难道看书还是太疏忽了?没记住哪些算法吗?也许是新知识太多了,还有感觉这两周老师上课上得挺快得,还没从树中走出来,图就快完了,然后新得一章又来了(-_-)!唉!找时间看书消化消化吧!
    

    2.PTA实验作业

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

    输入一行中缀表达式,转换一颗二叉表达式树,并求解.
    表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。
    如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。 转换二叉树如下:
    

    2.1.1设计思路(伪代码)

    void InitExpTree(BTree &T, string str)  //建表达式的二叉树
    {
            stack<BTree> s;   //存放结点的栈
            stack<char> op;    //存放操作符
            op.push('#');          //以#结束
             while(str[i]!='')    //遍历数组str
    	  {
    	  	 if(!In(str[i]) )  //操作数;
                     {
                           建立树结点,并让树进栈;
                     }
                     else
    		{
                           先判断操作栈是否空
                           再比较数组和栈顶的大小关系
                           根据大小关系做相应的操作
                     }
              }
              while(op.top() !='#')    
                {
                           遍历栈
                           根据关系,找左孩子和右孩子,建树
                }
    }
    double EvaluateExTree(BTree T)//计算表达式树
    {
              if (!T->lchild && !T->rchild)
    		return T->data - '0';         
                value1 = EvaluateExTree(T->lchild);          //递归口,让式子从叶子结点开始计算;
    	    value2 = EvaluateExTree(T->rchild);
                switch (T->data)      遍历树
    	{    
                     case '+':		
                    case '-':
    		case '*':     做相应的计算,并返回式子的结果
    		case '/':
            }
    }
    

    2.1.2代码截图



    2.1.3提交列表及说明

    • Q1:段错误
    • A1:在比较数组和栈顶时忘记判断栈是否空了。
    • Q2:编译错误
    • A2:在编译器上打代码,不小心把全部代码复制过去了。
    • Q3:答案错误
    • A3:在对栈做处理时,粗心大意,顺序弄反了。

    2.2题目二:7-4 jmu-ds-二叉树叶子结点带权路径长度和 (25 分)

    二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树所有叶子结点的带权路径长度和。 如下面的二叉树:
    

    2.2.1设计思路(伪代码)

    BTree CreatTree(string str,int i)
    {
           定义树的结构变量bt
           当i>len-1或str[i]='#'
    	    返回NULL
           申请结点BTNode
           将str[i]的值赋给bt->data
           递归调用函数CreatTree构建左右孩子
           返回bt
    }
    void GetWPL(BTree bt,int h,int &wpl)
    {
          判断树是否空,如果树为空,返回NULL
          如果左右孩子均不为空
          wpl+=bt->data-'0'乘以所在层数
          递归调用函数GetWpl,其中的h+1,得到所在层数 
    }
    

    2.2.2代码截图



    2.2.3提交列表及说明

    • Q1:编译错误
    • A1:没注意到编译器的语法改变。
    • Q2:段错误
    • A2:在比较i 和Len 时,以为直接return也可以,后面发现少了NULL不可以。

    2.3题目三:7-5 jmu-ds-输出二叉树每层节点 (22 分)

    ~~
    层次遍历树中所有节点。输出每层树节点。
    树结构按照树的先序遍历递归建树,比如先序遍历字符串“ABD#G###CEH###F#I##”#代表空节点。对应树结构如下图,

    ###2.3.1设计思路(伪代码)
    

    BinTree CreatBT(string str,int &i)
    {
    当i>len-1或str[i]='#'
    返回NULL
    定义树的结构变量BT
    申请结点BTNode
    将str[i]的值赋给BT->data
    递归调用函数CreatTree构建左右孩子
    返回bt
    }
    void Print(BinTree BT)
    {
    定义树的结构变量curNode,lastNode
    flag==1,表示该层输出完成,level表示该结点第几层
    把树赋给curNode,lastNode,然后让树中的结点进栈
    遍历栈,对头赋给curNode,判断为左孩子还是右孩子或者与lastNode相等,进行相应的赋值
    用flag控制树层
    最后输出栈顶
    }

    ###2.3.2代码截图
    ![](https://img2018.cnblogs.com/blog/1475633/201905/1475633-20190525134810174-444146696.png)
    ![](https://img2018.cnblogs.com/blog/1475633/201905/1475633-20190525134820964-1155081903.png)
    ![](https://img2018.cnblogs.com/blog/1475633/201905/1475633-20190525134832727-848096697.png)
    
    ###2.3.3提交列表及说明
    ![](https://img2018.cnblogs.com/blog/1475633/201905/1475633-20190525134953040-918398015.png)
    
     - Q1:部分正确
     - A1:对结点层数及该层所有结点的输出格式混乱
     - A2:用flag控制输出格式
    
    #3.阅读代码
    ##3.1题目
    

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
    示例:
    输入: [1,2,3,null,5,null,4]
    输出: [1, 3, 4]
    解释:

    1 <---
    /
    2 3 <---

    5 4 <---

    ##3.2解题思路
    

    用bfs算法对二叉树进行层序遍历,保存每层的最后一个节点

    ##3.3代码截图
    ![](https://img2018.cnblogs.com/blog/1475633/201905/1475633-20190525141545523-1491337428.png)
    
    ##3.4学习体会
    

    bfs算法为广度优先搜索(横向)。class是将数据与方法封装,让行为与数据一致的编程方法。与struct相同而又不同,class的成员默认是private,权限,struct默认是public权限。经百度得知integer是整型的意思,但C++里只有int,没有这个数据类型,但在java里有,且它是一个类, 是对象类型int的1原始类型。

  • 相关阅读:
    mac的端口被占用
    php中的运算符、控制结构
    文档模式影响浏览器的渲染
    ubuntu 命令 tips 来自于 ubuntu中文论坛
    用好 Emacs 中的 register
    [转载] Rsync命令参数详解
    使用 python 遍历目录下的文件
    灵活的左移位( << )操作
    使用 iperf 测试两台机器间的最大带宽
    Emacs server 新启动方式 (仅在emacs daemon未启动时才启动daemon)
  • 原文地址:https://www.cnblogs.com/Gejkdj/p/10891682.html
Copyright © 2011-2022 走看看