精品二叉树的使用报告数据结构C语言定.docx
- 文档编号:9815274
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:14
- 大小:109.64KB
精品二叉树的使用报告数据结构C语言定.docx
《精品二叉树的使用报告数据结构C语言定.docx》由会员分享,可在线阅读,更多相关《精品二叉树的使用报告数据结构C语言定.docx(14页珍藏版)》请在冰豆网上搜索。
精品二叉树的使用报告数据结构C语言定
数据结构作业报告
——二叉树的使用报告
姓名:
江海强
班级:
070921班
学号:
07092007
上机时间:
2010-10-14
报告时间:
2010-10-19
摘要
1.实验目的
此程序主要是让我们了解二叉树的链式结构的存储,理解二叉树的遍历过程,完成对二叉树的创建,输出其先序遍历、中序遍历、后序遍历以及层次遍历等基本操作。
让我们实现二叉树的基本函数和能够针对递归结构的二叉树进行查询、修改、删除等操作。
2.实验方法
主要是运用了递归法对二叉树进行先序遍历、中序遍历和后序遍历。
还适时定义了全局变量数组A[4][10]和静态变量depth,利用二叉树的性质实现了层次遍历,凹入法遍历等。
3.实验结果
由二叉树的结构图可以知道其先序遍历、中序遍历、后序遍历和层次遍历等的结果,用其来和运行结果作对比,可以得出结果完全符合要求。
即是此程序是正确的,成功的。
内容
一.问题重述
设计一个程序创建一个二叉树,编程打印该树的先序、中序、后序遍历序列和层次遍历序列,并且编程实现按照凹入表示法打印该树。
还要交换将该树所有左右子树,按照凹入表示法打印交换左右子树后的树。
最后输入待删除的结点内容,要求删除该结点子树,并打印删除后的二叉树。
而该二叉树要用Word绘出设计出其图形。
二.算法描述
本程序除了运用一些条件语句,判断语句,switch语句之外,主要运用了程序自身调用递归法。
XianXu(),ZhongXu()和HouXu()这三个子函数的复杂度都为O(N),其中N为二叉树的结点个数。
又XianXu()执行了两次,复杂度分别为O(N)和O(N-2),即总的时间复杂度为3×O(9)+O(7)。
CengCi()的复杂度为O(40)。
AoRu()的复杂度为3×O(9)+O(16),而AoRu()子函数执行了两次,故总的时间复杂度为6×O(9)+2×O(16)。
故所有输出型子函数的复杂度为:
9×O(9)+2×O(16)+O(7)+O(40)=O(160)。
由上述的二叉树图形结构图可以得知该二叉树的二叉树
先序遍历为:
1、2、4、8、5、3、6、9、7。
中序遍历为:
8、4、2、5、1、6、9、3、7。
后序遍历为:
8、4、5、2、9、6、7、3、1。
层次遍历为:
1、2、3、4、5、6、7、8、9。
此结果与下面的输出结果是一样的。
①.二叉树图形结构图
变换左右孩子之后的二叉树为右图②所示。
删除的结点也是从变换左右孩子之后的二叉树
中进行删除的。
其中删除的结点为4和6。
即为图③。
③删除的结点为4和6后的二叉树
②变换左右孩子之后的二叉树
三.变量说明
其中typedefstructBiTree为二叉树的结构体。
而lchild和rchild分别为二叉树结点的左右孩子。
并且把变量a,b,c,d,e,f,g,h和i作为二叉树的9个结点,其权分别为1,2,3,4,5,6,7,8和9。
定义depth为静态变量,是二叉树的深度-1。
depth会因为子函数AoRu()的调用次数而改变,而其对应着二叉树的输入结点的度-1。
定义数组A[4][10]为全局变量,是用来存放二叉树的结点的。
因为该二叉树的深度为4,即是depth可为0,1,2和3,而数组A[4][10]根据depth把不同的度的结点分别存放在A[0][10],A[1][10],A[2][10]和A[3][10]上,从而实现层次遍历。
四.函数与思路说明
本程序包含1个主程序和9个子函数。
其中输出型的子函数分别为XianXu(),ZhongXu(),HouXu(),CengCi()以及AoRu();还有一些换算的子函数,如Exchange(),ChildNode(),ExchangeChild()以及Deletenode()。
子函数XianXu(),ZhongXu()和HouXu(),是对已经创建好的二叉树分别进行先序遍历输出,中序遍历输出和后序遍历输出。
这三个子函数所使用的方法都是对自身进行调用的递归法。
CengCi()这个子函数是对二叉树进行层次遍历输出。
利用之前已经把该二叉树的结点按照度的不同而存入到数组A[4][10]上,运用for语句输出数组A[4][10],得出的数据即为原二叉树的层次遍历结果。
AoRu()这个子函数是对二叉树进行凹入遍历输出。
利用了二叉树结点的度的特点和对自身调用的递归法实现对二叉树的凹入遍历输出。
子函数Exchange()的功能是交换两个数。
而子函数ChildNode()的功能是判断二叉树结点的孩子的个数。
最后ExchangeChild()这个子函数则是调用了Exchange()和ChildNode(),从而实现对二叉树左右孩子的调换。
Deletenode()这个子函数的功能是删除给定的结点子树。
五.程序执行结果
二叉树凹入法遍历结果:
1
|---2
|---4
|---8
|---5
|---3
|---6
|---9
|---7
二叉树先序遍历结果:
124853697
二叉树中序遍历结果:
842516937
二叉树后序遍历结果:
845296731
二叉树层次遍历结果:
1
23
4567
89
交换左右子树后的二叉树的凹入法遍历结果:
1
|---3
|---5
|---8
|---4
|---2
|---7
|---9
|---6
删除某些结点后的二叉树的先序遍历结果:
1358279
六.结论
由前面的分析得知,虽然此程序的复杂度比较大,可是其基本思路是正确的,运行结果也是合法的,故本程序是成功的程序。
完成此程序让我们更好地理解二叉树的链式结构的存储,理解二叉树的遍历过程,能够针对递归结构的二叉树进行查询、修改、删除等操作。
七.编程中遇到的问题以及解决方法
编程中首先遇到的问题就是如何建立一个合理的二叉树。
刚刚开始利用递归法只能建立一个完全二叉树,而不能根据自己的意愿建立这个二叉树。
后来考虑到此二叉树的存储内容不多,就逐个输入,从而创建了自己想创建的二叉树。
另一个问题就是如何输出层次遍历。
后来利用前面的子函数AoRu()中depth值来把二叉树的结点都对应存储到全局变量数组A[4][10]中,从而实现层次遍历输出。
本来是想重新设计个类似子函数AoRu()的函数,可是考虑到空间复杂度的问题,就直接利用子函数AoRu()。
在这里,因为depth的值会变,所以只能在main()函数中先运行一次AoRu(),再运行子函数CengCi()。
而不能在先运行CengCi(),在运行AoRu();也不能先运行AoRu()两次或以上,再运行CengCi()。
八.附录
#include
#include
#include
intA[4][10]={0};
typedefstructBiTree
{
intdata;
structBiTree*lchild,*rchild;
}BiTree;
voidXianXu(BiTree*root)
{
printf("%d\t",root->data);
if(root->lchild!
=NULL)
XianXu(root->lchild);
if(root->rchild!
=NULL)
XianXu(root->rchild);
}
voidZhongXu(BiTree*root)
{
if(root->lchild!
=NULL)
ZhongXu(root->lchild);
printf("%d\t",root->data);
if(root->rchild!
=NULL)
ZhongXu(root->rchild);
}
voidHouXu(BiTree*root)
{
if(root->lchild!
=NULL)
HouXu(root->lchild);
if(root->rchild!
=NULL)
HouXu(root->rchild);
printf("%d\t",root->data);
}
voidCengCi()
{
inti,j;
for(i=0;i<4;i++)
{
for(j=0;j<10;j++)
if(A[i][j]!
=0)
printf("%d\t",A[i][j]);
printf("\n");
}
}
voidAoRu(BiTree*root,intx)
{
inti,t=0;
staticintj0=0,j1=0,j2=0,j3=0,depth;
depth=x;
if(depth>0)
{
for(i=0;i<2*depth-2;i++)printf("");
printf("|---");
}
printf("%d\n",root->data);
switch(depth)
{
case0:
A[0][j0++]=root->data;break;
case1:
A[1][j1++]=root->data;break;
case2:
A[2][j2++]=root->data;break;
case3:
A[3][j3++]=root->data;break;
}
if(root->lchild==NULL&&root->rchild!
=NULL)
depth=depth+2;
if(root->lchild!
=NULL)
{
depth++;
AoRu(root->lchild,depth);
}
if(root->rchild!
=NULL)
{
depth--;
AoRu(root->rchild,depth);
}
}
voidExchange(int*p1,int*p2)
{
intt;
t=*p1;
*p1=*p2;
*p2=t;
}
intChildNode(BiTree*node)
{
if((node->lchild!
=NULL)&&(node->rchild!
=NULL))return1;
elsereturn0;
}
voidExchangeChild(BiTree*root)
{
BiTree*stack[20];
BiTree*p;
inttop=0;
p=root;
do
{
while(p!
=NULL)
{
stack[++top]=p;
p=p->lchild;
}
if(top!
=0)
{
p=stack[top--];
if(ChildNode(p))
Exchange(&p->lchild->data,&p->rchild->data);
p=p->rchild;
}
}
while(top>0||p!
=NULL);
}
voidDeletenode(BiTree*root,BiTree*quchu)
{
BiTree*p;
p=(structBiTree*)malloc(sizeof(structBiTree));
p=quchu;
free(quchu);
root->rchild=NULL;
}
voidmain()
{
BiTree*a,*b,*c,*d,*e,*f,*g,*h,*i;
a=newBiTree;b=newBiTree;c=newBiTree;d=newBiTree;e=newBiTree;f=newBiTree;g=newBiTree;h=newBiTree;i=newBiTree;
a->data=1;a->lchild=b;a->rchild=c;
b->data=2;b->lchild=d;b->rchild=e;
c->data=3;c->lchild=f;c->rchild=g;
d->data=4;d->lchild=h;d->rchild=NULL;
e->data=5;e->lchild=NULL;e->rchild=NULL;
f->data=6;f->lchild=NULL;f->rchild=i;
g->data=7;g->lchild=NULL;g->rchild=NULL;
h->data=8;h->lchild=NULL;h->rchild=NULL;
i->data=9;i->lchild=NULL;i->rchild=NULL;
printf("二叉树凹入法遍历结果:
\n");
AoRu(a,0);
printf("\n二叉树先序遍历结果:
\n");
XianXu(a);
printf("\n\n二叉树中序遍历结果:
\n");
ZhongXu(a);
printf("\n\n二叉树后序遍历结果:
\n");
HouXu(a);
printf("\n\n二叉树层次遍历结果:
\n");
CengCi();
printf("\n交换左右子树后的二叉树的凹入法遍历结果:
\n");
ExchangeChild(a);
AoRu(a,0);
printf("\n删除某些结点后的二叉树的先序遍历结果:
\n");
Deletenode(b,e);
Deletenode(c,g);
XianXu(a);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 二叉 使用 报告 数据结构 语言