实验3 二叉树的操作及应用

  • 格式:docx
  • 大小:15.83 KB
  • 文档页数:7

实验3 二叉树的操作及应用

PB13000818 焦孟娇

实验目的:

1. 熟练掌握递归程序设计的方法。

2. 掌握二叉树的特性和基本算法。

问题描述:

二叉树是一种基本且常用的数据结构。二叉树的很多基本算法都可以用递归的形式来表述。本实验要求实现二叉树的如下操作:创建、销毁、复制、打印显示、先中后序遍历、查找元素、层序遍历、求二叉树的深度、宽度、结点数和叶子个数等。

实验内容:

一、队列的抽象数据类型定义为:

Queue operation

{

数据对象:

数据关系:

基本操作:

InitQueue(&S)

操作结果:构造一个空队列S

QueueLength(S)

初始条件:队列S已存在

操作结果:返回S的元素个数,即队列的长度

QueueEmpty(S)

初始条件:队列S已存在

操作结果:若S为空队列,则返回TRUE,否则FALSE

EnQueue(&S, e)

初始条件:队列S已存在

操作结果:插入元素e为队列新元素

DeQueue(&S, &e)

初始条件:队列S已存在且非空 操作结果:删除S的队头元素,并用e返回其值

GetHead(S, &e)

初始条件:队列S已存在且非空

操作结果:用e返回S的队头元素

ClearQueue(&S)

初始条件:队列S已存在

操作结果:将S清为空队列

DeleteQueue(&S)

初始条件:队列S已存在

操作结果:队列S被销毁

Print(S)

初始条件:队列S已存在

操作结果:输出队列S

} Queue operation

BiTree operation{

InitBiTree( &T )

// 操作结果:构造空二叉树T。

DestroyBiTree( &T )

// 初始条件:二叉树T已存在。

// 操作结果:销毁二叉树T。

CreateBiTree( &T, definition )

// 初始条件:definition给出二叉树T的定义。

// 操作结果:按definiton构造二叉树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()失败,则操作失败。

} BiTree operation

二、详细设计

(1)常量值、元素类型、结点类型和队列类型

#define OK 1

#define ERROR 0

#define TURE 1

#define FALSE 0

#define MAX_TREE_SIZE 100//树的最大结点数

#define MAXQSIZE 100//队列的最大长度

typedef char TElemType;

typedef int Status;

typedef struct BiTNode{

TElemType data;

struct BiTNode *lchild, *rchild;

}BiTNode,*BiTree;//定义二叉树结点类型

typedef struct{

BiTree *base;

int front; int rear;

}SqQueue;//定义队列的类型

(2)函数算法分析

函数原型:BiTree CreatBiTree(BiTree &T)

算法思想:以先序次序输入二叉树中结点的值创建二叉树,‘#’代表空树。

时间复杂度:O(n)。

空间复杂度:O(n)。

函数原型:Status PreOrderTraverse(BiTree T, int (*Visit)(TElemType e))

算法思想:先序遍历二叉树T 。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:Status InOrderTraverse(BiTree T, int (*Visit)(TElemType e))

算法思想:中序遍历二叉树T 。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:Status PostOrderTraverse(BiTree T, int (*Visit)(TElemType e))

算法思想:后序遍历二叉树T 。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:Status LevelOrderTraverse(BiTree T, int (*Visit)(TElemType e))

算法思想:利用队列层序遍历二叉树T。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:int NodeCount(BiTree T)

算法思想:使用递归算法计算结点个数

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:int LeafCount(BiTree T,int &leaf)

算法思想:递归计算二叉树的叶子结点个数。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:int Depth(BiTree &T)

算法思想:递归计算二叉树的深度。

时间复杂度:O(n)。

空间复杂度:O(1)。

函数原型:int Width(BiTree T,int n[],int &i)