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