1.树的存储结构

本组采用的树的存储结构为链式结构,选择如图所示的结构体
Name为结点的名称
LevelNum为孩子节点的个数
*Children[20]用来指向不同的孩子结点(类似于二叉树的结构体,且数组大小这里取20,不够可以再增加)

2.树的函数说明

1.void Creatstr(string *str,int &length) 读取并分割文件中的字符串

   strtok是字符串分割函数,作用是将ch字符串中的字符串分割,分割的规则是在ch碰到与split变量有关的符号,都会将其改成‘\0’
例如 split = "<>"
ch = <html>
用strtok分割后ch就变成了html,注意split中若有空格,ch中的空格也会被改成'\0',而且不是碰到 <> 在一起时才会将其改成'\0',只要字符串中含有 < 或者 > 都会被其改成'/0'
void Creatstr(string *str,int &length)利用这个函数strtok()对读取到的文件中的字符串进行分割并且存入一个字符串数组中
比如 文件中的内容如下
<html>
<head><title>Demo</title></head>
<body>
<div>A<p>B</p>C</div>
<span>D</span>
</body>
</html>
利用Creatstr(string *str,int &length)进行处理后str字符串数组中
str[0] = html
str[1] = head
str[2] = title
str[3] = Demo
str[4] = /title
......依次类推
而length就是字符串数组str的大小

2.void CreatTree(string *str,BTNode *&T,int length) 建立多叉树

利用Creatstr()函数得到的字符串数组str[ ]以及其长度length进行建树,建树方法如下
建立两个类型为<BTNode*>的栈 s1,s2
for i=0 to length-1 //遍历str
{
若str[i][0]!='/' 建立一个结点,结点的名称为str[i],进s1栈
若str[i][0]=='/' (在s1栈中找到与之匹配的元素,例如 /html 对应html (在下方有解释))
{
while (不匹配) { s1.top()进s2栈且s1.pop() }
找到匹配元素后(经过while循环后匹配元素此时在s1.top())
{
BTNode* T=s1.top() s1.pop() //用指针T存放栈顶元素然后让栈顶出栈
T对应的结点的孩子结点个数即为栈s2的长度 即T->LevelNum=s2.size()
将s2的元素依次出栈直到栈空,并且依次存放到T->Children[ ]中
最后将T入s1栈
} }
} 然后这里是配对的操作 即代码中的1 2 3步骤
str2=str[i]
str2.erase(str2.begin())
用str2保存str[i],再用erase函数去除'/'字符
str2.begin()是指向str2字符串的第一个字符,str.erase(p)就是删去str中p对应的字符
所以str2.erase(str2.begin())是将str2字符串中的第一个字符串删去例如 str2=/htmel,经过erase()函数处理后就变成了 html
然后再去找s1中配对的元素

3.int FindPositionCode(BTNode *T,string name,int *a,int flag,int &flag2)



该函数有5个参数BTNode *T为树,
str name所查找元素的名称,
int *a为数组的头地址,且a[ ]数组中的元素全部为-1
int flag为孩子结点Children[ ]对应的下标,头节点没有对应下标就用 -1
int &flag2为了判断所查找的元素是否存在,存在时返回0,不存在时返回1
该函数运行结果会把位置编码储存再数组a[ ]中
而位置编码由上面的树状图来解释
例如元素e的位置就为00,f的为01,g的为02,h的为10.....
但是经过该函数处理后的数组a[ ]中a[0]一定为-1,后面的元素也都会是-1
所以数组a有用的部分就是 for a[1] to a[i] (a[i]的下一个元素a[i+1]=-1)
例如e的位置编码为00,则数组a[10]将会是-1 0 0 -1 -1 -1 -1 -1 -1 -1
f的位置编码为01,则数组a[10]将会是-1 0 1 -1 -1 -1 -1 -1 -1 -1

4.void FindPosition(BTNode *T,int *a) 按格式输出元素路径

该函数利用上面FindPositionCode()函数得到的数组a[ ],然后进行处理,最后按格式输出路径

5.void CreatFileTree(BTNode *T,int i,FILE *fp) 建立文档树并写入tree.txt文件中

用递归遍历树T,然后再按照格式输出文档树
(类似于线序遍历,看代码慢慢体会)

3.树结果演示











4.碰到问题

1.选择树的结构体上花费较多时间
2.建树算法为本小组自创的非递归算法,在设计过程中花费较多时间,最后参考算术表达式转化成中缀表达式的算法设计出来
3.在设计输出路径的功能中,采取先获取位置编码然后再进行输出处理的做法也是本小组自创,在设计过程中也花费较多时间
4.在调式上,因为传参时忘了加符号&,导致程序崩溃

5.小结

1.虽然采用了比较不同的结构体,但是采取该结构体后可能会造成空间上的浪费
2.采用该结构体在遍历时时间复杂度比较高,而且建树过程较为复杂
3.好处就是建树的模型比较清晰做法比较独特

6.小组成员分配说明

main()函数:刘羽 1.5分
Creatstr()函数:阮承南 1.5分
CreatTree()函数:唐洪俊 2分
FindPositionCode()函数:沈宇涛 2分
FindPositionCode()函数:沈宇涛
CreatFileTree()函数:蔡丰俊 2分
博客园:张明海 1分

DS博客作业04--树大作业的更多相关文章

  1. DS博客大作业--树(李天明组)

    DS博客大作业--树 大作业博客要求 (10分) 1.树的存储结构说明 .树采用的是链式存储结构. .这段代码中定义了两个结构体.第一个是自定义为Name类型的结构体,里面的成员有字符串str和类型为 ...

  2. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

  3. DS博客作业08--课程总结

    DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...

  4. DS博客作业--07查找

    目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...

  5. DS博客作业05--查找

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...

  6. DS博客作业03--树

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...

  7. DS博客作业05--树

    1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会 学完树之后,最大的感觉就是在处理节点之间的兄弟父亲关系的时候真的挺好用的,一目了然.不过,树令人比较头疼的就是要用递归,大致能懂递归 ...

  8. DS博客作业04--图

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...

  9. DS博客作业01--日期抽象数据类型

    1.思维导图及学习体会(2分) 1.1第一章绪论知识点思维导图 1.2学习体会 从暑假看视频到开学的预习,我感觉数据结构与c语言比起来更加抽象,更加难理解,那些概念也只能理解一些字面意思,对时间复杂度 ...

  10. DS博客大作业--树

    1.树的存储结构说明 树节点结构体 data:文件名 brother:兄弟节点 child:孩子节点 type:节点的类型,0为文件,1为目录 h:节点所在的层次 2.树的函数说明 头文件 函数1:C ...

随机推荐

  1. php--正则(手机号码)

    PHP手机号码正则表达式 php用正则表达式判断手机号码的写法:从文章中匹配出所有的手机号就可以preg_match_all(),如果要检查用户输入的手机号是否正确可这样来检查:preg_match( ...

  2. 【CNN】 吴恩达课程中几种网络的比较

    LeNet5 AlexNet VGG16 ResNet  : 残差网络 Inception Net :  特点,可以通过1*1*192 的卷积核来缩减参数个数,压缩维度,约缩减10倍, 例如  :用1 ...

  3. jquery.serializejson.min.js的妙用

    关于这个jquery.serializejson.min.js插件来看,他是转json的一个非常简单好用的插件. 前端在处理含有大量数据提交的表单时,除了使用Form直接提交刷新页面之外,经常碰到的需 ...

  4. HTML中由于DIV(块元素)浮动,导致的父元素高度塌陷问题的解决方案

    费话不多说,直接上问题: 1.开始时,页面只有两个DIV的嵌套(见图) 运行结果是: 现在看运行的是正常的,但是当我设置让 class="box2" 的DIV浮动时 运行结果是这样 ...

  5. SpringMVC【一、概述】

    今天是端午前最后一天上班,今天开始加上端午3天学习SpringMVC~! 参考资料: http://blog.csdn.net/swingpyzf/article/details/8885459 概述 ...

  6. docker container 导入和导出

    目录 docker container 导入和导出 1.前言 2.docker container 的导出 3.docker container 的导入 4.镜像和容器 导出和导入的区别 docker ...

  7. Image Processing and Computer Vision_Review:HPatches A benchmark and evaluation of handcrafted and learned local descriptors——2017.04

    翻译 HPatches:手工和学习本地描述符的基准和评估——http://tongtianta.site/paper/8979 摘要:在本文中,我们提出了一个评估本地图像描述符的新基准.我们证明现有数 ...

  8. Ubuntu系统--安装官方flash插件包的方法

    浏览器安装官方install_flash_player_npapi_linux.x86_64.tar.gz插件包的方法 第一步:下载安装包. adobe flash player的官方下载instal ...

  9. ACM中值得注意/利用的C++语法特性

    C++ 的易踩坑点 随时补充 STL不能边循环边erase() //自己写的求交集RE了 for (set <int> ::iterator it = s.begin(); it != s ...

  10. MySQL No Install zip安装方法

    解压 解压安装包到一个目录,比如:D:\Database\mysql-5.1.55 配置 创建配置文件 创建一个my.ini文件,MYSQL目录下有几个my开头的ini文件,是针对不同配置使用,具体可 ...