数据结构课程设计之树与二叉树的转换.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.