博客作业04--树
一、学习总结(2分)
1.树结构思维导图
2 树结构学习体会
- 学习数据结构觉得比C难多了,就算理解了概念什么的代码还是不会打,看了代码之后又忘记了,就像小亮学长上次讲期中考试卷时候说的,数据结构没什么好说的,代码得背。
- 这次的PTA做了好久,博客也是一点一点补起来的,理解容易代码难打。
- 树这一部分教完了之后感觉也还好,背好代码!!务必多多看书+背代码背代码背代码!
二、PTA实验作业(4分)
题目1:6-4 jmu-ds-表达式树
1.设计思路(伪代码或流程图)
InitExpTree函数 //建表达式的二叉树
定义字符型栈op存放运算符
定义结构体bt存放表达式
#号放入栈底
while(str[i]!='\0')
if(str[i]不是运算符)
层次遍历法将数据存到bt中
i++;
else //调用Precede()函数比较优先级
if(栈顶元素优先级低于所比较元素 )
str[i++]进op栈内
else if(栈顶元素优先级等于所比较元素)
op栈顶元素出栈,i++
else if(栈顶元素优先级高于所比较元素)
栈顶元素出栈,其data存入bt中,所比较元素进栈
end while;
while(栈顶元素不为'#')
输出栈内剩余操作符
EvaluateExTree函数计算表达式树
double m, n;
if(只有根节点) 返回根节点的值
m = EvaluateExTree(T->lchild);
n = EvaluateExTree(T->rchild);
if(T->data为'+') 返回m+n的值
else if(T->data为'-') 返回m-n的值
else if(T->data为'*') 返回m*n的值
else if(T->data为'/')
if(分母为0)
输出"divide 0 error!"
exit(0);
else 返回m/n的值
2. 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
3.PTA提交列表说明。
- 做这道题的时候那个循环老是不对,i++找错位置,用for不对改成while就对了,因为for里的i自增的位置不同,导致段错误,前面一直改不出来。
题目2:7-2 根据后序和中序遍历输出先序遍历
1.设计思路(伪代码或流程图)
CreateBT函数构造二叉树
定义结构体指针b,整型指针p,整型变量r,k
if(n<=0)返回空;
将根节点值赋给r
for p=in to in+n-1 //中序遍历中查找根节点
if(找到根节点) 跳出循环
k=p-in为根节点在中序遍历里的下标
/*递归调用,构造用左子树和右子树*/
b->lchild = CreateBT(post, in, k);
b->rchild = CreateBT(post+k, p+1, n-k-1);
返回b;
PreOrder函数//先序遍历二叉树
if(树BT不为空)
if(此时BT指向根节点)
输出BT->data;
else if (BT不指向根节点)
输出空格+BT->data;
/*递归调用遍历左右子树*/
PreOrder(BT->lchild);
PreOrder(BT->rchild);
2. 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
3.PTA提交列表说明。
- 这道题问题不是很大,主要就是根据中序和后序遍历创建出二叉树这个函数。先从后序遍历找到根节点,再在中序遍历中找出与根节点相同的数据的下标,该下标左边所有字符为其左子树的中序遍历,右边的则为右子树的中序遍历,以此递归构建左右子树。
题目3:7-8 jmu-ds-二叉树叶子结点带权路径长度和
1.设计思路(伪代码或流程图)
int main()
char str[100];
gets(str);
int len=0, i, sum=0;
if(无数据,即为空树)
输出"0";
return 0;
len = strlen(str);
for i=1 to len/2-1 //除最后一层进行遍历
if(该节点为叶子节点)
sum += (str[i]-'0')*(int)(log2(i)); //int强制转换,求所在层数-1的值,即边的数目
for(i=i to len-1) //最后一层,有数据的均为叶子结点
if(数据为不#,即为叶子节点)
sum += (str[i]-'0')*(int)(log2(i));
输出sum
return 0;
2. 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
3.PTA提交列表说明。
- 其实做这道题的时候,本来是用书本上那种构造函数的方法做的,但是一直都只有树为空这一个测试点通过,另外几个测试点就在段错误和答案错误之间徘徊,后来就干脆依照二叉树的性质做完了这道题,并没有利用结构体创建树。可以的话我还是想要搞懂一下书上教的正规的写法的。。。
三、截图本周题目集的PTA最后排名(3分)
本次题目集总分:285分
必做题共:230分
1.PTA排名
2.我的得分:230 得2.5分
四、阅读代码(必做,1分)
修理牧场
功能: 用队列优先将队列元素从小到大排列,小的先出队。主要步骤为:将木块锯成两截,再将长的锯成成两截,重复以上操作。实现、、即可得出将给定长度木头锯成N块的最少花费。
(ps:我刚写这道题的时候是部分正确,没有好好利用队列的出入队,三层嵌套循环使得程序运行超时,一直想想不出更加简洁的方法,百度了一下终于搞清楚,,所以说队列和树的结合使用还需加强!)