DS博客作业05-树

DS博客作业05-树

1.本周学习总结

1.思维导图

1475633-20190525152649181-1456060397.png

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]!='\0')    //遍历数组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代码截图

1475633-20190525095533797-1430325216.png
1475633-20190525095546969-327352017.png
1475633-20190525095600464-1473251612.png

2.1.3提交列表及说明

1475633-20190524214334169-420970378.png

  • 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代码截图

1475633-20190525104555068-1733564702.png
1475633-20190525104610212-2022780831.png
2.2.3提交列表及说明
1475633-20190525104644565-79094927.png

  • 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代码截图

1475633-20190525134810174-444146696.png
1475633-20190525134820964-1155081903.png
1475633-20190525134832727-848096697.png

2.3.3提交列表及说明

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代码截图

1475633-20190525141545523-1491337428.png

3.4学习体会

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

转载于:https://www.cnblogs.com/Gejkdj/p/10891682.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值