数据结构课程设计二叉树.docx
《数据结构课程设计二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构课程设计二叉树
中南民族大学
数据结构课程设计报告
姓名:
康宇
年级:
2010
学号:
10061014
专业:
计算机科学与技术
指导老师:
宋中山
2013年4月15日
实习报告:
二叉树
题目:
设计一个能实现二叉树相关功能的程序
班级:
计科一班姓名:
康宇学号:
10061014完成日期:
2013.4.15
一、需求分析
1、二叉树分析:
遍历二叉树是二叉树各种操作的基础。
实现二叉树遍历的具体算法与所采用的存储结构有关。
不仅要熟练掌握各种遍历策略的递归和非递归算法,了解遍历过程中“栈”的作用和状态,而且能灵活运用遍历算法实现二叉树的其他操作。
理解前序序列和中序序列可唯一确定一颗二叉树的道理,理解具有相同的前序序列而中序序列不同的二叉树数目与序列12……n按不同顺序进栈和出栈所能得到的排列的数目相等的道理,掌握有前序序列和中序序列建立二叉树的存储结构的方法。
2、测试数据:
选择实现方式:
由先序和中序或中序和后序得唯一二叉树并打印输出。
1)先序:
EBADCFHGIKJ中序:
ABCDEFGHIJK
2)中序:
DCBGEAHFIJK后序:
DCEGBFHKJIA
3、实现提示:
用结构体来存储二叉树结点structBiTNode,包含数据域doubledata和左右孩子指针structBiTNode*lchild,*rchild;利用递归算法来先序遍历,中序遍历以及后续遍历来实现唯一二叉树的确定。
二、概要设计
1.元素类型(链表):
typedefstructBiTNode//结点类型
{
chardata;//数据域
ints;//节点深度
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode;
2.本程序包括九个模块:
1)主程序:
intmain()
{
while
(1)
{
输出菜单;
switch(n)
{
case1:
先中序确定唯一二叉树并打印输出;
break;
case2:
中后序确定唯一二叉树并打印输出;
break;
case0:
exit
(1);
default:
printf("请重新输入!
!
\n");
}
}
}
2)前中序确定二叉树函数:
voidPre_In_Order()
{
//定义头结点*head
输入前序序列;
输入中序序列;
N=strlen(q);
调用验证唯一二叉树函数head=Qzroot(q,z,N);
调用深度函数Depth(head);
打印二叉树Output(head);
}
3)中后序确定二叉树函数:
voidPre_In_Order()
{
//定义头结点*head
输入中序序列;
输入后序序列;
N=strlen(q);
调用验证唯一二叉树函数head=Zhroot(q,z,N);
调用深度函数Depth(head);
打印二叉树Output(head);
}
4)前中序确定二叉树实现函数:
BiTNode*Qzroot(char*a,char*b,intl)
{
BiTNode*New;
if(树为空)
returnNULL;
New=(BiTNode*)malloc(LEN);
根节点赋值New->data=a[0];
左右孩子指针分别赋值为空;
i=0;
while(b[i]!
=a[0])i++;
p=a+1;
q=b;
左子树New->lchild=Qzroot(p,q,i);
p=a+i+1;
q=b+i+1;
右子树New->rchild=Qzroot(p,q,l-i-1);
returnNew;
}
5)中后序确定二叉树实现函数:
BiTNode*Zhroot(char*a,char*b,intl)
{
BiTNode*New;
if(树为空)
returnNULL;
New=(BiTNode*)malloc(LEN);
根结点赋值New->data=b[l-1];
左右孩子指针分别赋值为空;
i=0;
while(a[i]!
=b[l-1])i++;
p=a;
q=b;
左子树New->lchild=Zhroot(p,q,i);
p=a+i+1;
q=b+i;
右子树New->rchild=Zhroot(p,q,l-i-1);
returnNew;
}
6)二叉树后序输出函数
voidPrint_Post(BiTNode*T)
{
if(T)
{
先输出左子树
再输出右子树
最后输出根结点
}
}
7)二叉树先序输出函数
voidPrint_Pre(BiTNode*T)
{
if(T)
{
先输出根结点
再输出左子树
最后输出右子树
}
}
8)深度函数
voidDepth(BiTNode*T)
{
if(结点不空)
{
根结点深度为dep;
dep++;
左孩子的深度Depth(T->lchild);
右孩子的深度Depth(T->rchild);
dep--;
}
}
9)打印输出函数
voidOutput(BiTNode*T)
{
if(树不空)
{
输出左子树Output(T->rchild);
控制格式输出树状图
for(inti=0;is;i++)
printf("\t");
printf("%c\n",T->data);
输出右子树Output(T->lchild);
}
}
三、详细设计
#include
#include
#include
#defineLENsizeof(BiTNode)
#defineNULL0
intdep=0;
typedefstructBiTNode
{
chardata;
ints;
structBiTNode*lchild,*rchild;
}BiTNode;
BiTNode*Qzroot(char*a,char*b,intl)
{
char*p,*q;
inti;
BiTNode*New;
if(l<=0)
returnNULL;
New=(BiTNode*)malloc(LEN);
New->data=a[0];
New->lchild=NULL;
New->rchild=NULL;
i=0;
while(b[i]!
=a[0])i++;
p=a+1;
q=b;
New->lchild=Qzroot(p,q,i);
p=a+i+1;
q=b+i+1;
New->rchild=Qzroot(p,q,l-i-1);
returnNew;
}
BiTNode*Zhroot(char*a,char*b,intl)
{
char*p,*q;
inti;
BiTNode*New;
if(l<=0)
returnNULL;
New=(BiTNode*)malloc(LEN);
New->data=b[l-1];
New->lchild=NULL;
New->rchild=NULL;
i=0;
while(a[i]!
=b[l-1])i++;
p=a;
q=b;
New->lchild=Zhroot(p,q,i);
p=a+i+1;
q=b+i;
New->rchild=Zhroot(p,q,l-i-1);
returnNew;
}
voidDepth(BiTNode*T)
{
if(T)
{
T->s=dep;
dep++;
Depth(T->lchild);
Depth(T->rchild);
dep--;
}
}
voidOutput(BiTNode*T)
{
if(T)
{
Output(T->rchild);
for(inti=0;is;i++)
printf("\t");
printf("%c\n",T->data);
Output(T->lchild);
}
}
voidPrint_Post(BiTNode*T)//输出二叉树的后序序列
{
if(T)
{
Print_Post(T->lchild);//先输出左子树
Print_Post(T->rchild);//再输出右子树
printf("%c",T->data);//最后输出根结点
}
}
voidPrint_Pre(BiTNode*T)//输出二叉树的先序序列
{
if(T)
{
printf("%c",T->data);//先输出根结点
Print_Pre(T->lchild);//再输出左子树
Print_Pre(T->rchild);//最后输出右子树
}
}
voidPre_In_Order()
{
charq[30],z[30];
intN;
BiTNode*head;
head=(BiTNode*)malloc(LEN);
printf("请输入前序序列:
");
scanf("%s",q);
printf("请输入中序序列:
");
scanf("%s",z);
N=strlen(q);
head=Qzroot(q,z,N);
Depth(head);
printf("由前序和中序确定的二叉树为:
\n\n");
Output(head);
}
voidIn_Post_Order()
{
charz[30],h[30];
intN;
BiTNode*head;
head=(BiTNode*)malloc(LEN);
printf("请输入中序序列:
");
scanf("%s",z);
printf("请输入后序序列:
");
scanf("%s",h);
N=strlen(z);
head=Zhroot(z,h,N);
Depth(head);
printf("由中序和后序确定的二叉树为:
\n\n");
Output(head);
}
intmain()
{
while
(1)
{
intn;
printf("----------------------二叉树----------------------\n");
printf("1...通过前序序列和中序序列建立二叉树并输出后序序列\n");
printf("2...通过中序序列和后序序列建立二叉树并输出前序序列\n");
printf("0.............................................退出\n");
printf("--------------------------------------------------\n");
printf("\n请输入您的选择:
");
scanf("%d",&n);
switch(n)
{
case1:
Pre_In_Order();
break;
case2:
In_Post_Order();
break;
case0:
exit
(1);
default:
printf("请重新输入!
!
\n");
}
getchar();
}
return0;
}
四、调试分析
1.本次作业还是有一定的难度的,核心算法在于怎样利用递归生成,遍历二叉树。
还有一个难点就是:
利用二叉树的先序序列和中序序列以及中序序列和后序序列确定唯一的二叉树,确定之后就可以很容易的遍历输出相对应的后序序列和中序序列了。
2.本程序模块简洁,在main()函数里得到充分体现,前中序函数Pre_In_Order()以及中后序函数In_Post_Order();
3.用户可灵活控制二叉树的大小,而且采用树状图形输出二叉树,便于用户观看。
本程序具有一定的普遍性。
五、用户手册
1.本程序运行环境为Windows操作系统,执行文件为:
二叉树.exe
2.进入演示程序后显示的界面:
六、测试结果