华科数据结构二叉树实验报告Word文档格式.docx
- 文档编号:22670234
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:48.45KB
华科数据结构二叉树实验报告Word文档格式.docx
《华科数据结构二叉树实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《华科数据结构二叉树实验报告Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
20.LevelOrderTraverse
4.4.2.系统采用二叉链表存储结构:
typedefstruct
{
TElemTypedata;
structBiTNode*lchild,*rchild;
//左右孩子指针
}BiTNode,*BiTree;
4.4.3.存储数据类型如下:
intnum;
charc;
}TElemType;
4.3系统实现
4.3.1.InitBiTree(BiTree*T)
初始条件:
二叉树根结点不存在
操作结果:
为根结点分配一个空间,将根结点数据值置为空字符,代表该树为空树
intInitBiTree(BiTree*T)
if(*T=(BiTNode*)malloc(sizeof(BiTNode)))//分配节点空间
{
(*T)->
data.c='
'
;
//节点置空
lchild=NULL;
rchild=NULL;
return1;
}
else
return0;
}
4.3.2.DestroyBiTree(BiTreeT)
二叉树存在
操作步骤:
递归释放左右子树,最后释放双亲节点
释放所有二叉树节点
intDestroyBiTree(BiTreeT)
if(!
T)
T->
lchild)
DestroyBiTree(T->
lchild);
//递归销毁左子树
rchild)
rchild);
//递归销毁右子树
free(T);
4.3.3.CreateBiTree(BiTree*T)
二叉树已被初始化
采用递归先序创建二叉树,其中,空节点用
成功创建二叉树
intCreateBiTree(BiTree*T)
charch;
getchar();
scanf("
%c"
&
ch);
if(ch=='
#'
){
*T=NULL;
else{
(*T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);
data.c=ch;
CreateBiTree(&
((*T)->
lchild));
//递归创建左子树
rchild));
//递归创建右子树
4.3.4.ClearBiTree(BiTreeT)
使用DestroyBitree函数释放所有节点,然后重新初始化
二叉树置空
intClearBiTree(BiTreeT)
DestroyBiTree(T);
InitBiTree(&
T);
//不同于Destroy的是之后又给头结点分配空间置空
4.3.5.BiTreeEmpty(BiTreeT)
二叉树T存在
判断二叉树是否为空
二叉树为空则返回1,不为空则返回0
intBiTreeEmpty(BiTreeT)
if(T->
data.c=='
)
4.3.6.BiTreeDepth(BiTreeT)
递归返回树的深度,递归出口为树根结点为空
返回树的深度
intBiTreeDepth(BiTreeT)
intdeep=0;
if(T){
intlchilddeep=BiTreeDepth(T->
//递归计算左子树深度
intrchilddeep=BiTreeDepth(T->
//递归计算右子树深度
deep=lchilddeep>
=rchilddeep?
lchilddeep+1:
rchilddeep+1;
returndeep;
4.3.7.Root(BiTreeT)
返回根结点
BiTNode*Root(BiTreeT)
if(BiTreeEmpty(T))
returnNULL;
returnT;
4.3.8.Value(BiTreeT,TElemTypee)
初始条件:
递归查找与传入节点值相等的节点
若该节点存在,则返回1,若不存在,则返回0
intValue(BiTreeT,TElemTypee)//返回e的值
T)return0;
data.c==e.c)return1;
if(Value(T->
lchild,e))return1;
//递归查找左子树
rchild,e))return1;
//递归查找右子树
4.3.9.Assign(BiTreeT,BiTNode*e,TElemTypevalue)
二叉树存在,传入一个节点值value,将其中节点e的值修改为value
判断节点是否在树T中,若在,则修改其数据,为value
若成功,e值被修改为value,并返回1,否则,修改失败,返回0
intAssign(BiTreeT,BiTNode*e,TElemTypevalue)
if(Value(T,value))
(*e).data=value;
4.3.10.Parent(BiTreeT,TElemTypee)
二叉树存在,e是其中一个节点
利用队列,先将根结点入队,在队列不为空的时候,出队,再将判断其左子树和右子树是否有与之相同的,若有,返回节点值,否则,将其左右孩子入队,返回循环,直到查找到该节点,返回该节点值,或者是未查找到返回空。
返回e的双亲,或者不存在双亲时,返回空字符
TElemTypeParent(BiTreeT,TElemTypee)
LinkQueueq;
QElemTypea;
if(T)
InitQueue(&
q);
//初始化队列
EnQueue(&
q,T);
//树根入队
BiTNode*p,*r;
while(!
QueueEmpty(q))//队不空
DeQueue(&
q,&
a);
//出队元素赋值给a
p=a->
lchild;
r=a->
rchild;
if(a->
lchild&
&
p->
data.c==e.c||a->
rchild&
r->
data.c==e.c)
//找到e(是其左或右孩子)
returna->
data;
//返回e的双亲的值
else//没找到e,则入队其左右孩子指针(如果非空)
q,a->
TElemTypes;
s.c='
returns;
//树空或没找到e
4.3.12.LeftChild(BiTreeT,TElemTypee)
递归调用函数查找左孩子,若存在,返回左孩子数值,若不存在,则返回空字符
返回e的左孩子,或者返回空字符
TElemTypeLeftChild(BiTreeT,TElemTypee)
BiTNode*p;
if(T==NULL)
data.c==e.c)
p=T->
if(p)
returnp->
LeftChild(T->
lchild,e);
rchild,e);
//递归查找右子树
4.3.13.RightChild(BiTreeT,TElemTypee)
递归调用函数查找右孩子,若存在,返回右孩子数值,若不存在,则返回空字符
返回e的右孩子,或者返回空字符
TElemTypeRightChild(BiTreeT,TElemTypee)
RightChild(T->
4.3.14.LeftSibling(BiTreeT,TElemTypee)
先查找e的双亲,然后根据双亲判断,其左孩子是否存在,若存在,则返回左孩子,不存在则返回空
返回e的左兄弟,不存在左兄弟时返回空
TElemTypeLeftSibling(BiTreeT,TElemTypee)
TElemTypea;
BiTreep;
BiTreeq,r;
a=Parent(T,e);
p=Point(T,a);
//找到双亲节点
if(p==NULL)
q=p->
r=p->
if(p->
data.c==e.c)//p存在左右孩子且右孩子是e
returnq->
//返回p的左孩子(e的左兄弟)
//树空或没找到e的左兄弟
4.3.15.RightSibling(BiTreeT,TElemTypee)
先查找e的双亲,然后根据双亲判断,其右孩子是否存在,若存在,则返回右孩子,不存在则返回空
返回e的左右兄弟,不存在右兄弟时返回空
TElemTypeRightSibling(BiTreeT,TElemTypee)
if(T)//非空树
//a为e的双亲
//p为指向结点a的指针
q->
data.c==e.c)//p存在左孩子且右孩子是e
returnr->
//返回p的左孩子(e的左兄弟)
//树空或没找到e的左兄弟
4.3.16.InsertChild(BiTreeT,TElemTypep,intLR,BiTreeC)
二叉树存在,p指向某个节点,LR为0或1,非空二叉树c与T不相交且右子树为空
当树C右子树为空时,根据LR,其值为0,将C插为左子树,当LR为1时,将C插为右子树,将断开部分连接为C的右子树。
将C根据LR的值连接为T的子树
intInsertChild(BiTreeT,TElemTypep,intLR,BiTreeC)
BiTNode*t,*c,*m,*n;
t=T;
c=C;
if(t==NULL||c==NULL)return0;
if(c->
rchild!
=NULL){
printf("
二叉树C含有右子树!
\n"
);
//判断C是否含有右子树
m=Point(t,p);
//找到p所在节点
if(LR){
n=m->
m->
rchild=c;
c->
rchild=n;
//插入为右子树
else{
lchild=c;
//插入为左子树
4.3.17.DeleteChild(BiTreeT,TElemTypep,intLR)
二叉树T存在
当p指向的节点存在时,根据LR的值删除其左子树,或右子树
根据LR的值,删除以p为根节点的子树
intDeleteChild(BiTreeT,TElemTypep,intLR){
BiTNode*q;
q=T;
if(q==NULL)return0;
q=Point(q,p);
//找到p指向的节点
q->
//删除右子树
//删除左子树
4.3.18.PreOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
二叉树存在
利用传入的visit函数进行显示递归进行遍历,先遍历根节点,然后遍历左子树,然后遍历右子树
先序遍历整个二叉树
intPreOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
if(T)
visit(T->
data);
PreOrderTraverse(T->
lchild,visit);
rchild,visit);
4.3.19.InOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
利用传入的visit函数进行显示递归进行遍历,先遍历左子树,然后遍历根节点,然后遍历右子树
中序遍历整个二叉树
intInOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
InOrderTraverse(T->
//遍历左子树
visit(T->
//输出根节点值
//遍历右子树
4.3.20.PostOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
利用传入的visit函数进行显示,递归进行遍历,先遍历左子树,然后遍历右子树,然后遍历根节点
后序遍历二叉树
intPostOrderTraverse(BiTreeT,int(*visit)(TElemTypee))
PostOrderTraverse(T->
4.3.21.LevelTraverse(BiTreeT,int(*visit)(TElemTypee))
二叉树存在
利用队列,先将根节点入队,然后队列顺序出队,出队元素的左右子树存在时,将他们入队,之后对该元素调用visit函数,直到队列为空
按层遍历整个二叉树
intLevelTraverse(BiTreeT,int(*visit)(TElemTypee))
LinkQueueQ;
Q);
p=T;
if(p)EnQueue(&
Q,p);
QueueEmpty(Q)){
Q,&
p);
lchild)EnQueue(&
Q,p->
rchild)EnQueue(&
visit(p->
data))return0;
4.3.22.Save(BiTreeT,FILE*pf)
递归进行保存,先序保存,节点为空时,保存节点值为“#”
保存整个二叉树到指定文件
intSave(BiTreeT,FILE*pf)
charc='
if(T==NULL)
fwrite(&
c,sizeof(char),1,pf);
(T->
data.c),sizeof(char),1,pf);
Save(T->
lchild,pf);
rchild,pf);
4.3.23.Load(BiTree*T,FILE*pf)
初始化过二叉树
递归进行读取,先序创建二叉树,过程类似与CreatBitree
将文件中的二叉树恢复到系统中
intLoad(BiTree*T,FILE*pf)
charc;
fread(&
if(c=='
*T=(BiTree)malloc(sizeof(BiTNode));
data.c=c;
Load(&
lchild),pf);
rchild),pf);
4.4效率分析
4.4.1.InitBiTree(BiTree*T)
效率分析:
执行常数运算,时间复杂度为O
(1)
4.4.2.DestroyBiTree(BiTreeT)
效率分析:
递归释放二叉树节点,对每一个节点操作一次,时间复杂度为O(n)
4.4.3.CreateBiTree(BiTree*T)
递归建立二叉树,对每一个节点操作一次,时间复杂度为O(n)
4.4.4.ClearBiTree(BiTreeT)
算法与Destroy相同,为O(n)
4.4.5.BiTreeEmpty(BiTreeT)
4.4.6.BiTreeDepth(BiTreeT)
4.4.7.Root(BiTreeT)
4.4.8.Value(BiTreeT,TElemTypee)
递归查找二叉树,对每一个节点操作一次,时间复杂度为O(n)
4.4.9.Assign(BiTreeT,BiTNode*e,TElemTypevalue)
基础为Value,时间复杂度为O(n)
4.4.10.Parent(BiTreeT,TElemTypee)
队列进行处理,时间复杂度由节点数决定,时间复杂度为O(n)
4.4.12.LeftChild(BiTreeT,TElemTypee)
递归查找二叉树,与节点数有关,时间复杂度为O(n)
4.4.13.RightChild(BiTreeT,TElemTypee)
4.4.14.LeftSibling(BiTreeT,TElemTypee)
函数基于Parent与Point,时间复杂度为O(n)
4.4.15.RightSibling(BiTreeT,TElemTypee)
4.4.16.InsertChild(BiTreeT,TElemTypep,intLR,BiTreeC)
函数基于Point,时间复杂度为O(n)
4.4.17.DeleteChild(BiTreeT,TElemTypep,intLR)
4.4.18.PreOrderTra
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 实验 报告