抽象类型实现二叉树实验报告1.doc
《抽象类型实现二叉树实验报告1.doc》由会员分享,可在线阅读,更多相关《抽象类型实现二叉树实验报告1.doc(56页珍藏版)》请在冰豆网上搜索。
![抽象类型实现二叉树实验报告1.doc](https://file1.bdocx.com/fileroot1/2022-10/7/18a6f94a-e066-4e73-a00e-806838fe38e7/18a6f94a-e066-4e73-a00e-806838fe38e71.gif)
一、设计任务、要求及所用软件环境或工具
设计任务:
选用顺序存储结构和二叉链表存储结构实现抽象数据类型二叉树的基本操作
编译环境:
VC++6.0
二、抽象数据类型定义
二叉树抽象类型定义如下
ADTBinaryTree{
基本对象D:
D是具有相同特性的数据元素的集合。
数据关系R:
若D=φ,则R=φ,称BinaryTree为空二叉树;
若D≠φ,则R={H},H是如下二元关系:
(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;
(2)若D-{root}≠φ,则存在D-{root}={D1,Dr},且D1∩Dr=φ;
(3)若D1≠φ,则D1中存在惟一的元素x1,∈H,且存在D1上的关系H1H;
若Dr≠φ,则Dr中存在惟一的元素xr,∈H,且存在D1上的关系HrH;
H={<root,xl>,<root,xr>,Hl,Hr};
(4)(Dl,{Hl})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵符合本定 义的二叉树,称为根的右子树。
基本操作P:
InitBiTree(&T);
操作结果:
构造空二叉树T。
DestroyBiTree(&T);
初始条件:
二叉树T存在
操作结果:
销毁二叉树T
CreateBiTree(&T,definition);
初始条件:
definition给出二叉树T的定义
操作结果:
按definition构造二叉树T
ClearBiTree(&T);
初始条件:
二叉树T存在
操作结果:
将二叉树T清为空树
BiTreeEmpty(T);
初始条件:
二叉树T存在
操作结果:
若T为空二叉树,则返回TRUE,否则返回FALSE
BiTreeDepth(T);
初始条件:
二叉树T存在
操作结果:
返回T的深度
Root(T);
初始条件:
二叉树T存在
操作结果:
返回T的根
Value(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
返回e的值
Assign(T,&e,value);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
结点e赋值为value
Parent(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
若e是T的非根节点,则返回它的双亲,否则返回“空”
LeftChild(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
返回e的左孩子。
若e无左孩子,则返回“空”
RightChild(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
返回e的右孩子。
若e无右孩子,则返回“空”
LeftSibling(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
返回e的左兄弟。
若e是T的左孩子或无左兄弟,则返回“空”
RightSibling(T,e);
初始条件:
二叉树T存在,e是T中某个结点
操作结果:
返回e的右兄弟。
若e是T的右孩子或无右兄弟,则返回“空”
InsertChild(T,p,LR,c);
初始条件:
二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子 树为空。
操作结果:
根据LR为0或1,插入c为T中p所指向结点的左或右子树。
p所指结点的原有左或 右子树则成为c的右子树
DeleteChild(T,p,LR);
初始条件:
二叉树T存在,p指向T中某个结点,LR为0或1.
操作结果:
根据LR为0或1,删除T中P所指结点的左或右子树
PreOrderTraverse(T,Visit());
初始条件:
二叉树T存在,Visit是对结点操作的应用函数
操作结果:
先序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操 作失败。
InOrderTraverse(T,Visit());
初始条件:
二叉树T存在,Visit是对结点操作的应用函数
操作结果:
中序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操 作失败
PostOrderTraverse(T,Visit());
初始条件:
二叉树T存在,Visit是对结点操作的应用函数
操作结果:
后序遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操 作失败
LevelOrderTraverse(T,Visit());
初始条件:
二叉树T存在,Visit是对结点操作的应用函数
操作结果:
层次遍历T,对每个结点调用函数Visit一次且仅一次。
一旦visit()失败,则操 作失败
}ADTBinaryTree
三、存储结构定义及各基本操作的实现
1.公用头文件base.h
//**************************Includes*****************************
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"windows.h"
#include"malloc.h"
#include"math.h"
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define MAXSIZE 100 //最多结点数
typedef int Status;
typedef char TElemType; //结点类型为字符型
//**************************其它操作********************************************
short wherex() //返回光标的x坐标
{
CONSOLE_SCREEN_BUFFER_INFOcsbinfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbinfo);
returncsbinfo.dwCursorPosition.X;
}
short wherey() //返回光标的y坐标
{
CONSOLE_SCREEN_BUFFER_INFOcsbinfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbinfo);
returncsbinfo.dwCursorPosition.Y;
}
voidgotoxy(shortx,shorty) //移动光标到(x,y)坐标
{
COORDpoint={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}
voidSetColor(unsignedshortTextColor=7)//设置字体颜色
{
unsignedBackGroundColor=0;
HANDLEhCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,TextColor|BackGroundColor);
}
void Print(unsignedx,unsignedy)//在(x,y)位置显示方框
{
SetColor(14);
gotoxy(x,y++);printf("╭──────────────╮");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("││");
gotoxy(x,y++);printf("╰──────────────╯");
SetColor();
}
void ClearWindow(unsignedx1=50,unsignedy1=0,
unsignedx2=80,unsignedy2=10)
//将屏幕(x1,y1,x2,y2)区域清屏,并显示方框
{
unsigned i,j;
for(i=x1;i for(j=y1;j {
gotoxy(i,j);
printf("");
}
Print(x1-2,y1);
}
void ClearLine(unsignedy=23)
//清除第y行与y+1行的字符,并使光标在行首,默认清除第23与24行
{
for(inti=0;i<158;i++)
{
gotoxy(i,y);
putchar('');
}
gotoxy(0,wherey()-1);
}
void ClearAera(unsignedx=96,unsignedy=22)
//清除(0,y)-(x,y+1)区域的字符,并使光标移动到y
{
for(unsignedi=0;i {
gotoxy(i%(x/2),y+(i/48));
putchar('');
}
gotoxy(0,y);
}
//*************************************************************************
Status Visit(TElemTypee)//二叉树结点Visit函数,显示字符的值
{
printf("%c",e);
returnOK;
}
2.顺序存储结构
存储结构定义:
//*****************二叉树顺序存储结构**********************
/*在一棵具有n个结点的满二叉树中,从树根起,自上层到下层,
/*逐层从左到右给所有结点从1开始编号到n,非满二叉树补为满二叉树再编号,
/*存储到数组中(0号单元存储结点个数),空结点规定为'&'。
*/
typedef TElemType *SqBiTree;