实现二叉树中所有节点左右子树的交换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现二叉树中所有节点左右子树的交换
IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】
数据结构课程设计
实验报告
题目名称:实现二叉树中所有节点左右子树的交换学院:信息科学与工程学院
专业班级:计算机科学与技术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、创建函数
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
{
if(T) { printf("%c",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild);
} }
3
、中序遍历函数
Y
{
if(T) {
InOrderTraverse(T->lchild);