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]!='\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代码截图



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原始类型。

posted on 2019-05-20 00:22  猜丁壳  阅读(317)  评论(0编辑  收藏  举报