第04次作业-树
1.学习总结
1.1树结构思维导图
1.2 树结构学习体会
树的结构是一种非线性结构,一对多,定义也是递归的,有一个根结点和任意个子树。
我的学习体会:我觉得树相比之前的一对一的线性结构来说,难度增大了很多,树的实现又会借用到之前学的栈啊,队列啊,就像是之前所学的大杂烩,并且会用上递归,虽然递归可读性很好,但是想出怎么写也是很难,看懂容易,自己写递归不容易。
树可以应用在查找,如二叉搜索树,用在求类似最优路径的问题,如哈夫曼树,应用在做计算表达式,把表达式转化成树,再求值,能算复杂运算。等等......
2.PTA实验作业
2.1题目一 6-4 jmu-ds-表达式树(25 分)
2.2 设计思路(伪代码或流程图)
void InitExpTree(BTree &T,string str)
{
初始化两个栈s1,s2,分别存操作数和运算符;
int i=0;BTree s;
while (i<str.size())
do
if(str[i]是操作数)
then
新建节点s,存入操作数,并置左右孩子为空;
s进栈s1;
else
then
if(s2为空)
then
新建节点s,存入运算符,并置左右孩子为空;
进栈s2;
else
if(str[i]的优先级大于s2.top())
then
新建节点s,存入运算符,并置左右孩子为空;
进栈s2;
else
then
if(str[i]是\')\')
then
while (s2.top()!=\'(\')
s2.top()->rchild=s1.top();
s1.pop()
s2.top()->lchild=s1.top();
s1.pop()
s2.pop()
end while
else
then
while(s2.top()!=\'(\'并且s2.top()优先级小于str[i])
重复上面遇到\'(\'的操作,为s2配左右孩子
end while
end while
}
double EvaluateExTree(BTree T)
{
if(T->data为数字字符)
return T->data-\'0\';
if(T为空)return 0;
else
{
switch(T->data)
{
case \'+\':return 左子树的值+右子树的值;break;
case \'-\':return 左子树的值-右子树的值;break;
case \'*\':return 左子树的值*右子树的值;break;
case \'/\':if(右子树空不为0)
return 左子树的值/右子树的值;break;
else 打印除零错误语句
}
2.3 代码截图
2.4 PTA提交列表说明。
除0错误
- 错误原因
例如输入1/0
会出现如下情况
百度之后发现这个nan是not a number 分母为零会产生这次错误
- 解决方法:询问同学后发现,把return 0转换成exit(0),并添加一个stdlib.h,就不会出现了,exit功能是关闭所有文件,终止正在执行的进程。
有括号表达式
- 错误原因
在优先级小于栈顶且不是右括号的时候,出栈应该出到栈顶元素优先级小于str[i],或遇到左括号,才能停止。不能只出一次 - 解决方法
增加while语句
while( s2.size()&&s1.size()&& Precede(s2.top()->data,str[i])==\'>\'&&s2.top()->data!=\'(\')
2.1题目二 7-7 修理牧场(25 分)
2.2 设计思路(伪代码或流程图)
采用哈夫曼树的思想,每次找出最小的两个
queue<int>q;
cin>>n;
int min1,min2;
for i=0 to n-1
cin>>p,p全部进队q
while (q.size()-1)
do
min1=q.front();q.pop()
min2=q.front();q.pop()
for i=0 to n-1
if(队首元素<min1)
then
q.push(min2)
min2的值等于min1
min1的值为队首元素
q.pop();
elseif(队首元素<min2)
then
q.push(min2)
min2=队首元素
q.pop()
else
q.push(队首);
q.pop();
endfor
sum=min1+min2
q.push(sum)
end while
2.3 代码截图
2.4 PTA提交列表说明
在codeblock测试过提交,一次就过了
2.1题目三 7-8 jmu-ds-二叉树叶子结点带权路径长度和(25 分)
2.2 设计思路(伪代码或流程图)
int sum 全局变量
btree create(string str ,int i )//顺序转化为二叉链
{
btree t;
t=new tnode;
if(i为负数||i>=str[i]) return NULL//注意>=
t->data=str[i];
t->rchild=(str,2*i+1)//下标关系
t->lchild=(str,2*i)
return t;
}
void level(btree t,int h)
{
if(t为空)
sum+=0;
if(t为叶子节点)
sum+=t->data*h;
else
{
level(t->lchild,h+1)//注意注意,h+1,不是h++!!
level(t->rchild,h+1)
}
}
2.3 代码截图
2.4 PTA提交列表说明。
- 错误原因
咨询同学得到两个测试数据 #1,#1234#56#7###9,这类情况出现问题
看了好几遍发现:( ,在create 函数中对不规范i的判定有问题,因为题目给的输出中第一个一定是#。所以当i>str.size()时,就出错了
- 解决方法
if(i<=0||i>str.size()) return NULL
改为
if(i<=0||i>=str.size()) return NULL
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:2分
必做题做完。
4. 阅读代码
代码截图:
代码说明:分别采用递归和非递归的方式来求树的宽度
代码地址 https://www.cnblogs.com/xiaodeyao/p/5064816.html