数据结构课程设计之树与二叉树的转换.docx
- 文档编号:23172795
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:17
- 大小:280.38KB
数据结构课程设计之树与二叉树的转换.docx
《数据结构课程设计之树与二叉树的转换.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之树与二叉树的转换.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之树与二叉树的转换
纲要
一程序设计要求与目的
二存储结构设计
三算法设计(流程图)
四详细设计(源代码)
五调试与分析
六实验总结
七参考文献
第一章程序设计要求与目的
题目:
树与二叉树的转换的实现。
以及树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树的实现。
第二章存储结构设计
引入头文件:
#include
#include
#include
设置常量:
#defineMAX_TREE_SIZE100
一般树的存储结构有以下几种:
双亲结点,孩子结点,孩子兄弟结点。
本实验运用到的是双亲结点和孩子兄弟结点。
具体存储结构如下:
/*树的双亲表示结点结构定义*/
typedefstruct
{
intdata;
intparent;//双亲位置域
}PTNode;
/*双亲表示法树结构*/
typedefstruct
{
PTNodenode[MAX_TREE_SIZE];
intcount;//根的位置和节点个数
}PTree;
/*树的孩子兄弟表示结点结构定义*/
typedefstructnode{
intdata;
structnode*firstchild;
structnode*rightsib;
}BTNode,*BTree;
第三章算法设计(流程图)
流程图:
第四章详细设计(源代码)
详细设计共有以下函数的实现:
树的初始化函数(双亲法和孩子结点法两种),建树函数,输出树函数,树的前序遍历函数(递归和非递归两种),树的后序遍历函数(递归和非递归两种),树的层次遍历函数,一般树和二叉树的转换函数。
主菜单和副菜单。
主函数。
具体代码如下:
//初始化树(双亲表示法)
voidinit_ptree(PTree*tree)
{
tree->count=-1;
}
//初始化树结点(孩子兄弟表示法)
BTNodeGetTreeNode(intx)
{
BTNodet;
t.data=x;
t.firstchild=t.rightsib=NULL;
returnt;
}
//树的前序遍历(递归)
voidpreorder(BTNode*T)
{
if(T!
=NULL)
{
printf("%d",T->data);
preorder(T->firstchild);
preorder(T->rightsib);
}
}
//树的前序遍历(非递归)
voidpreorder2(PTreeT)
{
inti;
for(i=0;i { printf("%d",T.node[i]); } } //树后序遍历(递归) voidinoeder(BTNode*T) { if(T! =NULL) { inoeder(T->firstchild); printf("%d",T->data); inoeder(T->rightsib); } } //树后序遍历(非递归) voidinoeder2(PTreeT) { inti; for(i=T.count-1;i>=0;i--) { printf("%d",T.node[i]); } } //层次遍历 voidlevel(PTreeT) { inti; for(i=0;i { printf("%d",T.node[i]); } } //水平输出二叉树 voidPrintBTree(BTNode*root,intlevel) { inti; if(root! =NULL) { PrintBTree(root->rightsib,level+1); for(i=1;i<=8*level;i++) printf(""); printf("-------%d\n",root->data); PrintBTree(root->firstchild,level+1); } } //输出树 voidprint_ptree(PTreetree) { inti; printf("序号结点双亲\n"); for(i=0;i<=tree.count;i++) { printf("%8d%8d%8d",i,tree.node[i].data,tree.node[i].parent); printf("\n"); } } /*用双亲表示法创建树*/ PTreeCreatTree(PTreeT) { inti=1; intfa,ch; PTNodep; for(i=1;ch! =-1;i++) { printf("输入第%d结点: \n",i); scanf("%d,%d",&fa,&ch); printf("\n"); p.data=ch; p.parent=fa; T.count++; T.node[T.count].data=p.data; T.node[T.count].parent=p.parent; } printf("\n"); printf("创建的树具体情况如下: \n"); print_ptree(T); returnT; } /*一般树转换成二叉树*/ BTNode*change(PTreeT) { inti,j=0; BTNodep[MAX_TREE_SIZE]; BTNode*ip,*is,*ir,*Tree; ip=(BTNode*)malloc(sizeof(BTNode)); is=(BTNode*)malloc(sizeof(BTNode)); ir=(BTNode*)malloc(sizeof(BTNode)); Tree=(BTNode*)malloc(sizeof(BTNode)); for(i=0;i { p[i]=GetTreeNode(T.node[i].data); } for(i=1;i { ip=&p[i]; is=&p[j]; while(T.node[i].parent! =is->data) { j++; is=&p[j]; } if(! (is->firstchild)) { is->firstchild=ip; ir=ip; } else { ir->rightsib=ip; ir=ip; } } Tree=&p[0]; returnTree; } /*主菜单*/ voidMenu() { printf("=================主菜单=======================\n"); printf("***输入1-------------以双亲法创建一棵一般树***\n"); printf("***输入2-------------树的前序遍历(递归)*******\n"); printf("***输入3-------------树的后序遍历(递归)*******\n"); printf("***输入4-------------树的前序遍历(非递归)*****\n"); printf("***输入5-------------树的后序遍历(非递归)*****\n"); printf("***输入6-------------层次序的非递归遍历*******\n"); printf("***输入0-------------退出程序*****************\n"); printf("==============================================\n"); printf("请输入执行的指令: "); } /*副菜单*/ voidMenu2() { printf("*****************副菜单*******************\n"); printf("***9-------------返回主菜单继续操作*******\n"); printf("***0-------------退出程序*****************\n"); } /*主函数*/ voidmain() { inti=0,c1,c2; PTreeT; BTNode*Tree; init_ptree(&T); loop: Menu(); scanf("%d",&c1); switch(c1) { case1: printf("建立一般树,依次输入各个结点情况: \n"); printf("输入结点方式: 双亲数据,整型数据(第一个结点双亲数据为-1,最后以-1,-1结束)\n例子: -1,11,3\n"); T=CreatTree(T); Tree=change(T); printf("一般树转换成二叉树后的情况: \n"); PrintBTree(Tree,i); getchar(); break; case2: printf("树的前序遍历(递归): \n"); preorder(Tree); printf("\n"); break; case3: printf("树的后序遍历(递归): \n"); inoeder(Tree); printf("\n"); break; case4: printf("树的前序遍历(非递归): \n"); preorder2(T); printf("\n"); break; case5: printf("树的后序遍历(非递归): \n"); inoeder2(T); printf("\n"); break; case6: printf("树的层次遍历: \n"); level(T); printf("\n"); break; case0: exit (1); break; } Menu2(); scanf("%d",&c2); if(c2==9) gotoloop; elseif(c2==0) exit (1); } 第五章调试与分析 程序开始: 建立一棵一般树: 输入指令1 输入结点的方式: 双亲数据(整型),结点数据(整型)以-1,-1结束 如: -1,11,2-1,-1 一般树创建完的具体情况: 把一般树转换为二叉树后: 副菜单选择: 选择9继续操作 运用各种遍历形式遍历树: 副菜单选择: 选择0结束程序 第六章实验总结 通过本次程序设计,让我更深层次地了解到了树各种函数的运用,如何运用各种存储结构创建树,以及在实验中还涉及到递归的运用,递归的思想省去了复杂的算法设计。 在实验中不可避免的出现了大大小小的问题,在调试中透彻领悟各种算法的真谛,同样的错误在下次遇到时就可以避免了。 在实验中,分别使用了VC++和TurboC两种编译器,在使用各种编译器的同时能了解不同的编译器的不同之处,取长补短,更好的设计程序。 参考文献 [1]赵坚,姜梅主编.据结构(C语言版).中国水利水电出版社.2006. [2]赵坚,姜梅主编.据结构(C语言版)学习指导与习题解答.中国水利水电出版社.2006.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 二叉 转换