DS博客作业——树
DS博客作业——树
1.本周学习总结
1.思维导图

2.谈谈你对树结构的认识及学习体会。
在树这一章节,我们学习的是二叉树的算法。
树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和中序遍历、或中序遍历和后序遍历来构造树(理解的还比较乱),还 有一种哈夫曼树的构造。
树的遍历:比较难的遍历是层次遍历,层次遍历需要利用环形队列(需复习)来进行操作。
线索二叉树到现在还是傻傻分不清。
结构体的构建也超级重要。
在树中常常会用到递归算法,递归口的设置也是一大难点。
2.PTA实验作业
2.1.题目1:7-3 jmu-ds-二叉树层次遍历
2.1.1设计思路(伪代码)
输入表示二叉树的顺序存储结构的字符串;
根据字符串构造树{
if 当前字符串下标>字符串长度||当前字符为#||者树为空 then
return NULL;
end if
bt->lchild=递归调用建树函数,下标为2*i;
bt->rchild=递归调用建树函数,下标为2*i+1;
}
层次遍历{
定义环形队列;
根节点入队;
while qu不为空 do
出队并输出;
if 有左孩子 then
将左孩子入队;
end if
if 有右孩子 then
将右孩子入队;
end if
end while
}
2.1.2代码截图




2.1.3本题PTA提交列表说明。

Q1:以为环形队列不能用queue类,结果把环形队列的代码都再写一遍。。。
A1:层次遍历其实只是需要一个队列来存放顺序,选取环形队列只是为了防止假溢出,而C++queue类没有这个顾虑。
Q2:其实刚开始的时候,在Dev-C++上编译错误,常把p->data=qu->data[qu->front]。
A2:p->data是char型,qu->data[]是BinTree型!!!搞清楚

Q3:树为空时,没有“NULL”输出。
A3:因为直接考虑第二个字符(因为第一个为‘#’)没有考虑到只有一个#的情况,即树为空的情况。再加上判断条件if(str[i]=='\0'),就好啦。

Q4:如何控制空格。
A4:直接定义一个全局变量flag,用flag控制格式。
2.2.题目2:7-4 jmu-ds-二叉树叶子结点带权路径长度和
2.2.1设计思路(伪代码)
创建树CreateBT(string str,int i){ //i为传入的字符的下标
if 下标越界||字符为‘#’||树为空 then
return NULL;
end if
bt->lchild=递归调用建树函数,下标为2*i;
bt->rchild=递归调用建树函数,下标为2*i+1;
}
求带权路径长度和void GetWpl(BinTree bt,int h,int &wpl ){ //h为层数,根节点为0层
if 树为空 then
return ;
end if
if 该结点是叶子节点 then
路径长wpl=叶子节点的权重*层数;
end if
递归调用GetWpl函数,查找左孩子的叶子节点,层数+1;
递归调用GetWpl函数,查找右孩子的叶子节点,层数+1;
}
2.2.2代码截图



2.2.3本题PTA提交列表说明。

(这题是在上机考上写的,就把上机考的提交列表交了,红色框框内为我的提交记录)
- Q1:在写建树函数时,忘记左孩子、右孩子与双亲结点的下标关系。
- A1:在一棵二叉树的顺序存储结构中,设该节点下标为i,则左孩子下标为2i,右孩子下标为2i+1。
- Q2:路径长的公式搞错。
- A2:当根节点算0层时,每个叶子节点的wpl=权重层数;当根节点算第1层的时候,每个叶子节点的wpl=权重(层数-1)。
2.3.题目3:题目名称:7-5 jmu-ds-输出二叉树每层节点
2.3.1设计思路(伪代码)
定义两个树指针,指向当前位置指针curNdoe,指向每层最后一个节点位置的指针lastNode;
定义一个树结构类型的队列q;
定义控制层数变化的变量flag,令flag=1;
令curNode=BT;
令lastNode=BT;
if 树为空 then
输出“NULL”;
return;
end if
将根节点入队;
while 队列不为空 do
curNode=队首元素;
if curNode有左孩子 then
curNode的左孩子进队;
end if
if curNode有右孩子 then
curNode的右孩子进队;
end if
if flag=1 then
输出格式“层数:”;
end if
if curNode为下一层的最后一个元素(即curNode=lastNode) then
输出目前队首结点;
出队;
lastNode=队尾结点;
flag=1;
end if
其他情况
输出队首结点;
出队;
flag=0;
end while
2.3.2代码截图



2.3.3本题PTA提交列表说明。

- Q1:当每一层最后结点不在上一层最后结点的右结点,则答案会出现错误。
- A1:记录上一层每个结点最靠右边的结点,在要进入下一层结点遍历时赋值给lastNode。
3、阅读代码
3.1 题目:玩转二叉树
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
3.2 解题思路
不必做镜像反转,只用在层次遍历的时候,先加入右儿子结点,再加入左儿子结点即可。
3.3 代码截图



3.4 学习体会
这道题按正常思路就是在建树的时候交换非叶子节点的左右孩子。但在正确的代码却是,只要在层次遍历的时候,将改动一下就可以,胜在灵活。
DS博客作业——树的更多相关文章
- DS博客作业08--课程总结
DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...
- DS博客作业--07查找
目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...
- DS博客作业05--查找
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...
- DS博客作业04--图
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...
- DS博客作业03--树
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...
- DS博客作业--课程总结
1.当初你是如何做出选择计算机专业的决定的? 经过一年学习,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 刚开始填报志愿的时候,因为我个人是没有什么比较特别 ...
- DS博客作业04--树大作业说明
大作业题目说明 1.目录树 按照如下目录路径,设计一颗目录树保存.并能实现对目录树遍历.目录路径存在file.txt,格式如下: b.txt c\ ab\cd.txt a\bc.txt ab\d.tx ...
- DS博客作业05--树
1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会 学完树之后,最大的感觉就是在处理节点之间的兄弟父亲关系的时候真的挺好用的,一目了然.不过,树令人比较头疼的就是要用递归,大致能懂递归 ...
- DS博客作业01--日期抽象数据类型设计与实现
1.思维导图及学习体会 1.1第一章绪论知识点思维导图 1.2 学习体会 这次博客园和大作业是我在编程学习中的有意义的进步,第一次尝试使用vs,并且通过同学的一些网站的推荐,和热心同学的帮忙,简单学会 ...
随机推荐
- windows7桌面小工具打不开的解决方案
将任务管理器中的sidebar.exe结束任务: 将C:\Users\用户名\AppData\Local\Microsoft\Windows Sidebar下的settings.ini的文件名修改为任 ...
- 关于“为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节”的网络解释修正
学到编码时,有个疑问——好好的占2字节的Unicode不用,却要用占3字节的UTF-8编码.发明 UTF-8的初衷不就是为了修正Unicode中任何字符至少占用2个字节的弊端吗? 虽然UTF-8英文字 ...
- poj 3159 Candies (差分约束)
一个叫差分约束系统的东西.如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径. 比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c. ...
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的 ...
- CF Gym 100637K Microcircuits (DP)
题意:给你n个点,将这些点放在一个环上,问你不相交的连k条线的方案数.(没有重点) 题解:dp[i][j]表示i个点连j条线的方案数,那么新加一个点i, 情况1,i没有和之前的点相连,方案数为dp[i ...
- [web开发] Vue + spring boot + echart 微博爬虫展示平台
1.微博登录 2.爬取数据 3.mysql存储 4.pyechart本地展示 5.用vue搭建网站web展示 先放图: 1.微博登录 新浪微博的登录不是简单的post就能解决的,他的登录有加密,所以我 ...
- C11 C语言文件的读写
目录 文件的打开和关闭 字符流读写文件 文件的打开和关闭 fopen( ) fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE ...
- 实验十二 团队作业8:软件测试与Alpha冲刺
实验十二 团队作业8:软件测试与Alpha冲刺 实验时间 2018-6-13 Deadline: [6.13-6.19]之间任选连续5天的23:00,以团队随笔博文提交时间为准. 评分标准: 按时交 ...
- linux - centos7 开放防火墙端口的新方式
CentOS 升级到7之后,发现无法使用iptables控制Linuxs的端口, google之后发现Centos 7使用firewalld代替了原来的iptables. 下面记录如何使用firewa ...
- cocos2dx观察者模式EventListenerCustom的使用(代替NotificationCenter)
在cocos2dx 3.x版本已经被弃用,改用EventDispatcher代替. 观察者模式是MVC模式的一种,一个model可以对应很多个观察者view,当model收到事件通知时,对应的view ...