二叉树实习报告 二叉树 实验报告文档格式.docx
- 文档编号:18417756
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:17
- 大小:91.77KB
二叉树实习报告 二叉树 实验报告文档格式.docx
《二叉树实习报告 二叉树 实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《二叉树实习报告 二叉树 实验报告文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
构造空二叉树T。
DestrofBiTree(&
T);
初始条件:
二叉树T存在。
操作结果:
销毁二叉树T。
CreateBiTee{&
T,definition};
初始条件:
definition给出二叉树T的定义
按definition构造二叉树T。
ClearBuTree(&
二叉树T存在;
将二叉树T清为空树
BiTreeEmpty(T);
若T为空二叉树,则返回TRUE,否则返回FALSE;
BiTreeDepth(T);
二叉树T存在
返回T的深度
Root(T);
返回T的根
Value(T,e);
二叉树T存在,e是T的某个节点;
返回e的根
Assign(T,&
e,value);
节点e赋为value
Parent(T,e);
若e是T的非根节点,则返回它的双亲,否则返回“空”
LeftChild(T,e);
返回e的左孩子,若e无左孩子,则返回“空”
RightChild(T,e);
返回e的右孩子,若e无右孩子,则返回“空”
LeftSibling(T,e);
返回e的左兄弟,若e是T的左孩子或无左兄弟,则返回“空”
RightSibling(T,e);
返回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所指节点的左或右子树,p
PreOrderTraverse(BiTreeT,Visit());
二叉树T存在,Visit是对结点操作的应用函数。
修
操作结果:
先序遍历T,对每个结点调用函数Visit一次且仅一次
InOrderTraverse(BiTreeT,Visit());
二叉树T存在,Visit是对结点操作的应用函数
中序遍历T,对每个结点调用函数Visit一次且仅一次
PostOrderTraverse(BiTreeT,Visit()){
//初始条件:
//操作结果:
后序遍历T,对每个结点调用函数Visit一次且仅一次
LevelOrderTraverse(BiTreeT,Visit()){
层序遍历T,对每个结点调用函数Visit一次且仅一次
}ADTBinaryTree
2.设定栈的抽象数据类型定义:
ADTStack{
数据对象:
D={ai|ai∈CharSet,I=1,2,……,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,I=2,…,n}
基本操作:
InitStack(&
S)
构造一个空栈S。
DestroyStack(&
初始条件:
栈S已存在
销毁栈S。
ClearStack(&
清空栈S。
StackLength(S)
返回栈S的长度。
StackEmpty(S)
若S为空栈,则返回true,否则返回false。
GetTop(S,&
e)
若栈S不空,则以e返回栈顶元素。
Push(&
S,e)
在栈S的栈顶插入新的栈顶元素e。
Pop(&
删除栈S的栈顶元素,并以e返回其值。
StackTraverse(S,visit())
从栈底到栈顶依次对S中的每个元素调用函数visit()。
}ADTStack
3.设定队列的抽象数据类型定义:
ADTQueue{
约定其中a1端为对猎头,an端为队列尾
基本操作:
InitQueue(&
Q);
操作结果:
构造一个空队列
DestroyQueue(&
Q);
初始条件:
队列Q已存在
队列Q被销毁,不再存在
ClearQueue(&
将Q清为空队列
QueueEmpty(Q);
若队列Q为空队列,则返回TRUE。
否则返回FALSE
QueueLength(Q)
返回Q的元素个数,即队列的长度
GetHead(Q,&
e);
用e返回Q的队头元素
EnQueue(&
Q,e);
队列Q已存在
插入元素e为Q的新的队尾元素
DeQueue(&
Q,&
Q为非空队列
删除Q的对头元素,并用e返回其值
QueueTraverse(Q,Visit());
Q已存在且非空;
从对头到队尾,依次对Q的每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。
}ADTQueue
4,本程序有3个模块,模块之间的调用关系如下
详细设计
1.二叉树类型
typedefcharTElemType;
//二叉树存储的数据类型
typedefstructBiTNode{//二叉树的结点定义
TElemTypedata;
BiTNode*lchild,*rchild;
//左右孩子指针
}BiTNode,*BiTree;
//------------基本操作的函数原型说明(部分)---------------------------
StatusCreateBiTree(BiTree&
//按先序次序输入二叉树中节点的值(一个字符)’#’字符表示空树
//构造二叉链表表示的二叉树
StatusPreOrderTraverse(BiTreeT,Status(*Visit(TelemTypee)));
//采用二叉链表存储结构,Visit是对节点操作的应用函数、
//先序遍历二叉树T。
对每个节点调用函数Visit一次且仅一次
//一旦Visit()失败。
则操作失败
StatusInOrderTraverse(BiTreeT,Status(*Visit(TelemTypee)));
//中序遍历二叉树T。
StatusPostOrderTraverse(BiTreeT,Status(*Visit(TelemTypee)));
//后序遍历二叉树T。
StatusLevelOrderTraverse(BiTreeT,Status(*Visit(TelemTypee)));
//层序遍历二叉树T。
其中部分操作的算法:
递归算法:
递归创建
voidCreateBiTree(BiTree&
T){
//按先序次序输入二叉树中节点的值(一个字符),’#’字符表示空树
//构造二叉链表表示的二叉树
Scanf(&
ch);
If(ch==’#’)T=NULL;
Else{
If(!
T=(BITNode*)malloc(sizeof(BiTNode)))exit(OVERFLOW);
T->
data=ch;
//将值赋给T所指结点
CreateBiTree(T->
lchild);
//递归构造左子树
rchild);
//递归构造右子树
}
//最简单的Visit函数
//StatusVisit(TelemTypee){
//printf(e);
//returnOK;
//}
先序递归遍历
StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemType)){
修改算法6.1
先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)//T不空
{
Visit(T->
data);
//先访问根结点
PreOrderTraverse(T->
lchild,Visit);
//再先序遍历左子树
rchild,Visit);
//最后先序遍历右子树
}
returnOK
}//PreOrderTraverse
中序递归遍历
StatusInOrderTraverse(BiTreeT,void(*Visit)(TElemType)){
中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
{
InOrderTraverse(T->
//先中序遍历左子树
//再访问根结点
InOrderTraverse(T->
//最后中序遍历右子树
returnOK;
}//InOrderTraverse
后序递归遍历
StatusPostOrderTraverse(BiTreeT,void(*Visit)(TElemType)){
//初始条件:
//操作结果:
后序递归遍历T,对每个结点调用函数Visit一次且仅一次
PostOrderTraverse(T->
//先后序遍历左子树
//再后序遍历右子树
//最后访问根结点
returnOK;
}//PostOrderTraverse
非递归算法:
先序非递归遍历
StatusPreOrderTraverse_Non(BiTreeT,Status(*Visit)(TElemType)){
//初始条件:
先序非递归遍历T,对每个结点调用函数Visit一次且仅一次
SqStackS;
InitStack(S);
while(T||!
StackEmpty(S)){
if(T){
Visit(T->
Push(S,T->
T=T->
lchild;
}//while
else{
Pop(S,T);
}//if
}//while
}//PreOrderTraverse*/
中序非递归遍历
StatusInOrderTraverse_Non(BiTreeT,Status(*Visit)(TElemType)){
中序非递归遍历T,对每个结点调用函数Visit一次且仅一次
BiTreep=T;
while(p||!
if(p){
Push(S,p);
//根指针进栈
p=p->
//遍历左子树
else{//根指针退栈,访问根节点,遍历右子树
Pop(S,p);
Visit(p->
rchild;
}//else
}//InOrdertraverse*/
后序非递归遍历
StatusPostOrderTraverse_Non(BiTreeT,Status(*Visit)(TElemType)){
后序非递归遍历T,对每个结点调用函数Visit一次且仅一次
SqStackS;
Push(S,T);
//根指针进栈
BiTreeprev=NULL;
//记录前一次访问的节点
BiTreecurr=NULL;
//记录当前访问的节点
while(!
StackEmpty(S))
{
GetTop(S,curr);
if(prev==NULL||prev->
lchild==curr||prev->
rchild==curr)
{//左右孩子尚未进栈,则依次进栈
if(curr->
lchild)
Push(S,curr->
rchild)
}
elseif(curr->
lchild==prev)
{
if(curr->
rchild)//左孩子已访问过,则访问右孩子
Push(S,curr->
}
else
{
Visit(curr->
//访问根节点
Pop(S,curr);
//
prev=curr;
//把curr标记为已访问过
}//PostOrdertraverse
层序遍历
StatusLevelOrderTraverse(BiTreeT,Status(*Visit)(TElemType)){
//层序遍历
SqQueueQ;
InitQueue(Q);
if(!
T)returnERROR;
EnQueue(Q,T);
QueueEmpty(Q)){
DeQueue(Q,p);
if(!
Visit(p->
data))returnERROR;
if(p->
lchild)EnQueue(Q,p->
rchild)EnQueue(Q,p->
2.栈类型
typedefBiTreeSElemType;
//栈中的元素是指向BiTNode结构体的指针
typedefstruct{
SElemType*base;
//在栈构造之前和销毁之后,bade的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
}SqStack;
//栈类型
//--------栈的基本操作--------------
StatusInitstack(SqStack&
//初始化,设S为空栈(S.top==NULL)操作成功则返回OK
StatusDestroyStack(SqStack&
S)
//销毁栈S,并释放所占空间,操作成功则返回OK
StatusClearStack(SqStack&
//将栈S清为空栈
intStackLength(SqStack&
s){
//返回栈S的长度
StatusStackEmpty(SqStackS)
//若S为空栈,则返回TRUE,否则,返回FALSE
StatusGetTop(SqStackS,SElemTypee)
//若S不空,则以e待会栈顶元素并返回TRUE,否则返回FALSE
StatusPush(SqStack&
S,SElemTypee)
//若分配成功,则在S的栈顶插入新的元素e,并返回TRUE
//否则栈不变,并返回FALSE
StatuePop(SqStack&
S,SElemType&
//若栈不空,则删除栈顶元素,并以元素e带回其值,并返回TRUE
StatusStackTraverse(SqStackS,Status(*Visit)(SElemType&
e))
//从栈底到栈顶一次对S中的每个元素调用Visit
()函数
其中部分函数操作的算法:
S,SElemTypee){
//若分配空间成功,则在S的栈顶插入新的元素E,并返回TRUE
If(MakeNode(p,e){
p.next=S.top;
S.top=p;
S.size++;
returnTRUE;
ElsereturnFALSE;
)
S,SElemType&
e){
If(StackEmpty)returnFALSE;
P=S.top;
S.top=S.top->
next;
e=p->
data;
S.size--;
2.队列类型
typedefBiTreeQElemType;
//队列中的元素元素是指向BiTNode结构体的指针
QElemType*base;
//初始化的动态分配存储空间
intfront;
//头指针
intrear;
//尾指针
}SqQueue;
//------------队列基本操作的函数原型说明(部分)-------------
StatusInitQueue(SqQueue&
Q)
//构造一个空队列Q
StatusDestroyQueue(SqQueue&
Q)
//销毁队列Q,Q不再存在
StatusClearQueue(SqQueue&
//将Q清为空队列
StatusQueueEmpty(SqQueue&
//若队列为空队列,则返回TRUE,否则返回FALSE
IntQueueLnegth(SqQueue&
//返回Q的元素个数,即队列的长度
StatusGetHead(SqQueueQ,QElemTypee)
//若队列不空,则以e返回Q的对头元素并返回TRUE,否则返回FALSE
StatusEnQueu(SqQueu&
Q,QElemTypee)
//插入元素e为Q的新的队尾元素
StatusDeQueue(SqQueue&
q,QElemType&
//若队列不空,则删除Q的对头元素,并用e返回其值,并返回TRUE
//否则返回FALSE
StatusQueueTraverse(SqQueueQ,Visit)
//从对头到队尾依次对Q中的每个元素调用函数Visit一次且仅一次
//一旦visit失败,则操作失败
StatusEnQueue(SqQueue&
Q,QElemTypee){
//若没队满
//插入e为Q的新的队尾元素
if(QueueFull(Q))returnERROR;
//队列满
Q.base[Q.rear]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉树实习报告 二叉树 实验报告 二叉 实习 报告 实验