实现二叉树中所有节点左右子树的交换.docx
- 文档编号:2383897
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:13
- 大小:163.14KB
实现二叉树中所有节点左右子树的交换.docx
《实现二叉树中所有节点左右子树的交换.docx》由会员分享,可在线阅读,更多相关《实现二叉树中所有节点左右子树的交换.docx(13页珍藏版)》请在冰豆网上搜索。
实现二叉树中所有节点左右子树的交换
IMBstandardizationoffice【IMB5AB-IMBK08-IMB2C】
实现二叉树中所有节点左右子树的交换
数据结构课程设计
实验报告
题目名称:
实现二叉树中所有节点左右子树的交换
学院:
信息科学与工程学院
专业班级:
计算机科学与技术1003班
姓名:
叶成功
学号:
指导教师:
陈国良教授李立三教授
日期:
2012年7月3日
一、问题描述
二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。
在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。
根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。
在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。
二、基本要求
要求:
。
构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。
实现如下步骤:
(1)实现二叉树的构造过程,并打印出二叉树
(2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历;
(3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树;
(4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。
三、数据结构的设计
由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:
数据域和左、右孩子的指针域。
这种存储结构可以方便二叉树的建立以及遍历。
1、结点的数据结构
structnode
{
chardata;
structnode*lchild,*rchild;
}
2、基本操作
voidCreate(BiTNode**p)
初始条件:
按照结点的结构体构造二叉树;
操作结果:
构造一棵二叉树。
voidPreOrderTraverse(BiTreeT)
初始条件:
二叉树T存在;
操作结果:
按照前序遍历方法遍历二叉树。
voidInOrderTraverse(BiTreeT)
初始条件:
二叉树T存在;
操作结果:
按照中序遍历方法遍历二叉树。
voidPostOrderTraverse(BiTreeT)
初始条件:
二叉树T存在;
操作结果:
按照后序遍历方法遍历二叉树。
voidLevelOrderTraverse(BiTreeT)
初始条件:
二叉树T存在;
操作结果:
按照层序遍历方法遍历二叉树。
voidSwapChild(BiTNode**p)
初始条件:
二叉树存在且交换的结点有子树;
操作结果:
将二叉树左右结点交换。
voidPaint(BiTreeT)
初始条件:
二叉树T存在;
操作结果:
将二叉树的结点打印出来。
四、软件模块结构图
构造二叉树
五、程序设计思想
1、程序设计基本思想
(1)本实验要求编写一个程序实现对二叉树的各种基本操作,并以此为目的设计一个程序,完成如下功能:
1、输入二叉树的先序序列字符,建立二叉链表。
注意:
输入时,必须加入虚结点以示空指针的位置;假设虚结点输入时用空格字符表示。
2、打印二叉树。
3、按先序、中序、后序和层序三种不同方法遍历二叉树。
4、交换二叉树的所有左右子树。
5、打印二叉树,并且分别按照先序、中序、后序和层序三种不同方法遍历二叉树。
6、在设计一个简单的菜单,分别调试上述算法。
7、编写主程序完成各功能的调用和实现。
(2)测试数据:
1、按照先序序列依次输入字符。
2、打印二叉树并且按先序、中序和后序遍历二叉树并输出遍历结果。
3、输出交换二叉树的左右子树并且打印二叉树并且按先序、中序和后
序遍历二叉树并输出遍历结果。
2、程序设计基本思想
本程序含有7个函数;
①主函数main()
②前序遍历二叉树PreOrderTraverse(T,PrintChar)
③中序遍历二叉树Inorder(T)
④后续遍历二叉树Postorder(T)
⑤层序遍历二叉树LevelOrderTraverse(T)
⑥打印二叉树Paint(T)
⑦交换二叉树所有左右子树SwapChild(T)
六、程序流程图
1、创建函数
YN
voidCreate(BiTNode**p)
{
chare;
e=getchar();
if(e=='*')
(*p)=NULL;
else
{
if(!
((*p)=(BiTree)malloc(sizeof(BiTNode))))
{
printf("分配失败\n");
exit(0);
}
(*p)->data=e;
Create(&((*p)->lchild));
Create(&((*p)->rchild));
}
}
2、前序遍历函数
Y
N
voidPreOrderTraverse(BiTreeT)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
3、中序遍历函数
Y
N
voidInOrderTraverse(BiTreeT)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
4、后序遍历函数
N
Y
voidPostOrderTraverse(BiTreeT)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
5、层序遍历函数
voidLevelOrderTraverse(BiTreeT)
{
BiTreeQ[MaxLength];
intfront=0,rear=0;
BiTreep;
立二叉树(前序)\n");
printf("2.打印二叉树\n");
printf("3.遍历二叉树(层序,前序,中序,后序)\n");
printf("4.交换左右子树\n");
printf("0.退出\n");
printf("----------------------------------\n");
printf("你的选择:
");
scanf("%d",choice);
getchar();立二叉树(前序)\n");
printf("2.打印二叉树\n");
printf("3.遍历二叉树(层序,前序,中序,后序)\n");
printf("4.交换左右子树\n");
printf("0.退出\n");
printf("----------------------------------\n");
printf("你的选择:
");
scanf("%d",choice);
getchar();序.后序递归算法的复杂度是相同的,递归算法非常的简单。
例如先序先访问跟节点,然后访问左节点,再访问右节点。
仔细看一下递归程序,就会发现,其实每次都是子树的左子树(lchild),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。
其实过程很简单:
一直往左走root->lchild->lchild->lchild...->null,由于是先序遍历,因此一遇到节点,便需要立即访问;由于一直走到最左边后,需要逐步返回到父节点访问右节点,时间方面每个节点调用一次函数,访问一次,是O(n).没有空间开销,所以是0.中序.后序递归算法同先序一样。
时间复杂度是O(n),空间复杂度是0.同理可知中序与后序也是一样的。
非递归层序遍历有不一样。
层序遍历中每次将节点压入队,然后弹出,再让左子树入队,再让右子树入队,在遍历过程中,左右子树依次入队出队。
时间复杂度O(n),空间复杂度为0。
问题一:
前序遍历、中序遍历以及后序遍历为递归算法很简单就没什么可说的了,而层次遍历就需要用到队列处理稍微复杂一点。
创建二叉树时,要求二叉树内容可以是各种形式,刚开始编创建算法的时候调试总是出错,后来经过参考数据结构相关资料才发现有一个地方少写一行申请空间的代码。
问题二:
非递归算法在编程时都是不很顺利,其中层序遍历有点难,需要掌握队列的知识,但是经过我不懈努力,最终成功的解决了这个问题。
问题三:
要注意输入必要的头文件,比如调用malloc需要的头文件,否者编译出错,有时不知道头文件可以查询书本。
问题四:
在这次课程设计中其实主要问题就是编程完成后会有很多小错误。
所以需要耐心调试
算法的改进设想:
我没有想到更好的算法,我想到的最好的算法编出的C语言程序代码只有100多行,但是可以非常成功的解决了问题。
我认为我的算法应该算是最简洁的算法了。
九、数据测试
数据测试主要是由截图来说明,编译成功后,按照前序遍历的方法输入子树,空子树用*表示,在本程序中输入的是一个有二十个结点的二叉树,输入ABDHP**Q**IR**S**EJT***K**CFL**M**GN**O**,则构成一棵拥有二十个结点的完全二叉树,如图:
输入二叉树后,分别调用打印函数、前序遍历函数、中序遍历函数、后序遍历函数以及层次遍历函数,在功能实现后。
调换二叉树所有的左右子树,再分别调用打印函数、前序遍历函数、中序遍历函数、后序遍历函数以及层次遍历函数。
所有功能都实现后,退出程序。
程序运行中的截图如下所示。
1、主菜单界面
2、建立一棵有二十个结点的完全二叉树
3、打印二叉树
4、遍历二叉树
5、二叉树左右子树交换
6、交换后打印二叉树
7、交换后二叉树的遍历
8、退出程序
十、用户使用手册
十一、心得体会
为期两周的课程设计结束了,在这次的课程设计中我们将抽象的数据结构理论知识与大一所学的C语言相结合,完成了这次课程设计。
在完成这个课程设计的过程中,从问题分析、程序设计以及程序调试每个环节都必须要做到完美,因为这几环都是环环相扣的,只有在前一环做好的情况下才能完好的做第二步
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
通过这次程序设计,我在许多方面都有所提高。
通过这次课程设计,综合运用本专业所学课程:
数据结构与C语言程序的理论知识,同时也将相关的理论知识都有了全面的复习,独立思考的能力也有了提高。
在这次设计过程中,体现出自己单独设计程序的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的所有的课程设计的指导老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次课程设计中遇到了各种各样的困难,有些不能自己解决的都得到老师您的细心指导。
而您开朗的个性和宽容的态度,也帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 二叉 所有 节点 左右 子树 交换