第04次作业-树
1.学习总结
1.1树结构思维导图
1.2 树结构学习体会
认识:
树是由n个节点组成的有限集合,它是一种非线性结构,它的每一个结点可以有0个或多个后继结点,但是只有一个前驱结点(除了根结点),数据元素之间存在一对多的关系。
遇到的困难:
课上听得懂老师讲的内容,但是打代码的时候又不知从何下手,对递归的理解也不够透彻,打代码的时候会被绕晕。
树结构可以解决的问题:
可以将表达式进行转换,处理家谱,查找文件等。
2.PTA实验作业
2.1 题目1:6-3 先序输出叶结点
2.2 设计思路
void PreorderPrintLeaves{
if BT不为0
if只有一个根结点
输出根结点的元素
end if
end
PreorderPrintLeaves(BT->Left);
if BT->Left的左子树,右子树均不为空
输出BT结点的元素;
end if
PreorderPrintLeaves(BT->Right);
if BT->Right的左子树,右子树均不为空
输出BT结点的元素;
end if
end if
end
}
2.3 代码截图
2.4 PTA提交列表说明。
错误:
一开始只有空树的测试点是对的,然后加了判断是否只有根结点后,对了另外两个测试点,空树变成了错的。
解决方法:
将判断是否只有根结点的代码放到判断树是否为空的代码中,便可以通过。
2.1 题目2:6-4 jmu-ds-表达式树
2.2 设计思路
void InitExpTree(BTree &T,string str){
定义栈s1存储树,s2存储运算符;
BTree BT,a,b;
定义i等于0;
while i<str.size()
then
if str[i]不是运算符
CreateExpTree( BT , NULL , NULL , str[i] );
s1.push(BT);
else
if s2为空
将str[i]进栈s2;
i++;
end if
else
while s2不为空,且s2栈顶元素的优先级小于str[i];
then
将s1栈顶元素值赋给a;
s1出栈;
将s1栈顶元素值赋给b;
s1出栈;
CreateExpTree( BT ,a , b , s2.top() );
将BT入栈s1;
s2出栈;
end while
while S2不为空,且s2栈顶元素的优先级大于str[i]
then
将str[i]入栈s2;
i++;
end while
while S2不为空,且s2栈顶元素的优先级等于str[i]
then
s2出栈;
end while
end
while s2不为空
then
将s1栈顶的值赋给a;
s1出栈;
将s1栈顶的值赋给b;
s1出栈;
CreateExpTree( BT , a , b , s2.top() );
s2出栈;
BT入s1栈;
end while
将s1.top的值赋给T;
}
2.3 代码截图
2.4 PTA提交列表说明
错误:
没有判断栈是否为空,加上以后还是错误,还没有找到如何修改。
2.1 题目2:7-2 根据后序和中序遍历输出先序遍历
2.2 设计思路
定义全局变量h[1000],z[1000]来存储后序和中序
int main()
{
定义n,i;
输入n,h[i],z[i]的值;
Tree head = RestoreTree(0,n-1,0,n-1);
输出PostOrder;
PostOrder(head);
}
Tree RestoreTree(int h1,int h2,int z1,int z2){
Tree T;
定义i;
if h1>h2
T为空;
end if
else
给T申请存储空间;
将h[h2]的值赋给T结点;
for i等于z1 to z2
if z[i] 等于 h[h2];
break;
end
T->left=RestoreTree(h1,h1+i-z1-1,z1,i);
T->right=RestoreTree(h1+i-z1,h2-1,i+1,z2);
end
返回T;
}
void PostOrder(Tree BT){
输出BT结点的值;
PostOrder(BT->left);
PostOrder(BT->right);
}
2.3 代码截图
2.4 PTA提交列表说明。
错误:
没有看清楚题目,把给的后序遍历当成了先序遍历,以为输出格式是只有数字之间要空格。
解决方法:
把后序遍历的最后一个值赋给T,再将递归的时候传入函数的值修改,输出时是每个数字前面都要一个空格,最后一个数末尾没有空格。
3.截图本周题目集的PTA最后排名
3.1 PTA排名截图
3.2 我的总分:1.5
4. 阅读代码(必做)
地址:
https://gitee.com/zhoubinghui/data_structure/blob/master/%E6%A0%91%E4%BB%A3%E7%A0%81/7-1%20%E8%BF%98%E5%8E%9F%E4%BA%8C%E5%8F%89%E6%A0%91.cpp
功能:
还原二叉树
优点:
通过使用递归函数,根据给出的树的先序和中序遍历来还原二叉树,思路清晰。