数据结构课程设计之树与二叉树的转换.docx

上传人:b****1 文档编号:23172795 上传时间:2023-05-15 格式:DOCX 页数:17 大小:280.38KB
下载 相关 举报
数据结构课程设计之树与二叉树的转换.docx_第1页
第1页 / 共17页
数据结构课程设计之树与二叉树的转换.docx_第2页
第2页 / 共17页
数据结构课程设计之树与二叉树的转换.docx_第3页
第3页 / 共17页
数据结构课程设计之树与二叉树的转换.docx_第4页
第4页 / 共17页
数据结构课程设计之树与二叉树的转换.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数据结构课程设计之树与二叉树的转换.docx

《数据结构课程设计之树与二叉树的转换.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之树与二叉树的转换.docx(17页珍藏版)》请在冰豆网上搜索。

数据结构课程设计之树与二叉树的转换.docx

数据结构课程设计之树与二叉树的转换

纲要

一程序设计要求与目的

二存储结构设计

三算法设计(流程图)

四详细设计(源代码)

五调试与分析

六实验总结

七参考文献

 

第一章程序设计要求与目的

题目:

树与二叉树的转换的实现。

以及树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树的实现。

第二章存储结构设计

引入头文件:

#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.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1