实验六二叉树的递归遍历及其应用.doc
文本预览下载声明
(第二题)
需求分析
从键盘输入二叉树的先序序列,按照先序建树的方法完成二叉树的创建。
2、从键盘输入一段正确的序列后,按回车键自动生成二叉树,若该序列不能生成一颗二叉树,则程序无法继续进行,只能退出。
3、按层次遍历需要用到队列的功能,故需要加入队列的相关操作。
4、 程序能实现的功能包括:
①初始化二叉树;②创建一棵完整二叉树;③按层次遍历二叉树;④打印各结点的层次;⑤求二叉树的宽度;概要设计
1、二叉树的抽象数据类型定义:
ADT BinaryTree{
数据对象D:D是具有相同特征的数据元素的集合。
数据关系R:
若D=空,则R=空,称BinaryTree为空二叉树;
若D!=空,则R={H},H是如下二元关系:
在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;
若D-{root}!=Φ,则存在D-{root}={D1,Dr},且D1∩Dr=Φ;
若D1!=Φ,则D1中存在唯一元素x1,root,x1∈H,且存在D1上的关系H1包含于H;若Dr!=Φ,则Dr中存在唯一的元素,root,xr∈H,且存在Dr上的的关系Hr包含于H;H={root,,x1,root,xr,H1,Hr};
(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
基本操作:
InitBiTree(BT)
操作结果:构造空二叉树
CreateBiTree(BT)
操作结果:建立二叉树
PreOrder(BT)
初始条件:二叉树BT已存在
操作结果:先序遍历
InOrder(BT)
初始条件:二叉树BT已存在
操作结果:中序遍历
PostOrder(BT)
初始条件:二叉树BT已存在
操作结果:后序遍历
TreeWidth(BT)
初始条件:二叉树BT已存在
操作结果:求BT的宽度
GetLevel(BT)
初始条件:二叉树BT已存在
操作结果:按层次遍历求层次
}ADT BinaryTree;
2、队列的抽象数据类型定义相关操作(略)
3、本程序模块结构
主函数模块
void main(){
初始化两颗二叉树;
创建二叉树BT,返回根结点BT;
getchar();
while(继续运行){
目录;
Switch(select){
1. PreOrder Traversal;
2. InOrder Traversal;
3. PostOrder Traversal;
4. LevelOrder Traversal;
5. TreeWidth;
6. Exit;
scanf(%d,select);
}
}
}
详细设计
1、基本数据类型操作
⑴二叉链表的存储结构
typedef char TElemType;
typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
调试分析
1、求结点层次要在按层次遍历时将其层级计算出来并作为队列元素的一项跟随结点入队,输出结点时再一同输出层次,计算其层次时,要注意先后入队元素之间的关系。
2、求二叉树宽度时也是通过按层次遍历完成的,通过得到结点的层次后,再遍历结点,同一层次结点数最多则该层结点数即为二叉树宽度。五、用户说明及测试结果七、附录(源代码及部分注释)
#include stdio.h
#include stdlib.h
#include conio.h
#include string.h
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define INFEASIBLE -2
#define Max_Tree_SIZE 20//最大结点数
#define STACK_INIT_SIZE 100
#define STACKINCRENT 10
#define MAXQSIZE 100
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
//定义队列中数据元素
typedef struct{
BiTree Bi;
int level;
}QElemType;
//队列模块
typedef struct Queue{
QElemType *base;
int fro
显示全部