数据结构C语言版二叉树的三叉链表存储表示Word格式文档下载.docx
- 文档编号:20946340
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:18
- 大小:18.16KB
数据结构C语言版二叉树的三叉链表存储表示Word格式文档下载.docx
《数据结构C语言版二叉树的三叉链表存储表示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版二叉树的三叉链表存储表示Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
//构造空二叉树T
intInitBiTree(BiPTree*T)
{
*T=NULL;
return1;
}
//销毁二叉树T
voidDestroyBiTree(BiPTree*T)
if(*T)//非空树
{
if((*T)->
lchild)//有左孩子
DestroyBiTree(&
(*T)->
lchild);
//销毁左孩子子树
rchild)//有右孩子
rchild);
//销毁右孩子子树
free(*T);
//释放根结点
*T=NULL;
//空指针赋0
}
#defineClearBiTreeDestroyBiTree
//按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
//构造仅缺双亲指针的三叉链表表示的二叉树T。
变量Nil表示空(子)树
voidCreate(BiPTree*T)//CreateBiTree()调用
TElemTypech;
scanf("
%c"
&
ch);
if(ch==Nil)//空
else
*T=(BiPTree)malloc(sizeof(BiTPNode));
if(!
*T)
exit(0);
(*T)->
data=ch;
//生成根结点
Create(&
//构造左子树
//构造右子树
//构造一个空队列Q
intInitQueue(LinkQueue*Q)
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
//动态分配一个空间
if(!
(*Q).front)
exit(0);
(*Q).front->
next=NULL;
//队头指针指向空,无数据域,这样构成了一个空队列
//若Q为空队列,则返回1,否则返回0
intQueueEmpty(LinkQueueQ)
if(Q.front==Q.rear)
return1;
return0;
//插入元素e为Q的新的队尾元素
intEnQueue(LinkQueue*Q,QElemTypee)
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
p)//存储分配失败
//生成一个以为e为数据域的队列元素
p->
data=e;
//将该新队列元素接在队尾的后面
(*Q).rear->
next=p;
(*Q).rear=p;
//若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0
intDeQueue(LinkQueue*Q,QElemType*e)
QueuePtrp;
if((*Q).front==(*Q).rear)
p=(*Q).front->
next;
//队头元素
*e=p->
data;
next=p->
if((*Q).rear==p)
(*Q).rear=(*Q).front;
free(p);
//构造三叉链表表示的二叉树T
intCreateBiTree(BiPTree*T)
LinkQueueq;
QElemTypea;
Create(T);
//构造二叉树(缺双亲指针)
parent=NULL;
//根结点的双亲为"空"
InitQueue(&
q);
//初始化队列
EnQueue(&
q,*T);
//根指针入队
while(!
QueueEmpty(q))//队不空
{
DeQueue(&
q,&
a);
//出队,队列元素赋给a
if(a->
{
a->
lchild->
parent=a;
//给左孩子的双亲指针赋值
EnQueue(&
q,a->
//左孩子入队
}
rchild->
//给右孩子的双亲指针赋值
//右孩子入队
}
//若T为空二叉树,则返回1,否则0
intBiTreeEmpty(BiPTreeT)
if(T)
//返回T的深度
intBiTreeDepth(BiPTreeT)
inti,j;
T)
if(T->
lchild)
i=BiTreeDepth(T->
i=0;
rchild)
j=BiTreeDepth(T->
j=0;
returni>
j?
i+1:
j+1;
//返回T的根
TElemTypeRoot(BiPTreeT)
returnT->
returnNil;
//返回p所指结点的值
TElemTypeValue(BiPTreep)
returnp->
//给p所指结点赋值为value
voidAssign(BiPTreep,TElemTypevalue)
data=value;
//返回二叉树T中指向元素值为e的结点的指针
BiPTreePoint(BiPTreeT,TElemTypee)
if(T)//非空树
q,T);
//根结点入队
data==e)
returna;
//入队左孩子
//入队右孩子
returnNULL;
//若e是T的非根结点,则返回它的双亲,否则返回"空"
TElemTypeParent(BiPTreeT,TElemTypee)
BiPTreea;
a=Point(T,e);
//a是结点e的指针
if(a&
&
a!
=T)//T中存在结点e且e是非根结点
returna->
parent->
//返回e的双亲的值
returnNil;
//其余情况返回空
//返回e的左孩子。
若e无左孩子,则返回"空"
TElemTypeLeftChild(BiPTreeT,TElemTypee)
a->
lchild)//T中存在结点e且e存在左孩子
//返回e的左孩子的值
//返回e的右孩子。
若e无右孩子,则返回"空"
TElemTypeRightChild(BiPTreeT,TElemTypee)
rchild)//T中存在结点e且e存在右孩子
//返回e的右孩子的值
//返回e的左兄弟。
若e是T的左孩子或无左兄弟,则返回"空"
TElemTypeLeftSibling(BiPTreeT,TElemTypee)
//T中存在结点e且e存在左兄弟
=T&
lchild&
lchild!
=a)
//返回e的左兄弟的值
//返回e的右兄弟。
若e是T的右孩子或无右兄弟,则返回"空"
TElemTypeRightSibling(BiPTreeT,TElemTypee)
//T中存在结点e且e存在右兄弟
rchild&
rchild!
=a)
//返回e的右兄弟的值
//根据LR为0或1,插入c为T中p所指结点的左或右子树。
p所指结点
//的原有左或右子树则成为c的右子树。
intInsertChild(BiPTreep,intLR,BiPTreec)
if(p)//p不空
if(LR==0)
c->
rchild=p->
lchild;
if(c->
rchild)//c有右孩子(p原有左孩子)
c->
parent=c;
p->
lchild=c;
parent=p;
else//LR==1
rchild;
rchild)//c有右孩子(p原有右孩子)
rchild=c;
return0;
//p空
//根据LR为0或1,删除T中p所指结点的左或右子树
intDeleteChild(BiPTreep,intLR)
if(LR==0)//删除左子树
ClearBiTree(&
p->
else//删除右子树
//先序递归遍历二叉树T
voidPreOrderTraverse(BiPTreeT,int(*Visit)(BiPTree))
Visit(T);
//先访问根结点
PreOrderTraverse(T->
lchild,Visit);
//再先序遍历左子树
rchild,Visit);
//最后先序遍历右子树
//中序递归遍历二叉树T
voidInOrderTraverse(BiPTreeT,int(*Visit)(BiPTree))
InOrderTraverse(T->
//中序遍历左子树
//再访问根结点
//最后中序遍历右子树
//后序递归遍历二叉树T
voidPostOrderTraverse(BiPTreeT,int(*Visit)(BiPTree))
PostOrderTraverse(T->
//后序遍历左子树
//后序遍历右子树
//最后访问根结点
//层序遍历二叉树T(利用队列)
voidLevelOrderTraverse(BiPTreeT,int(*Visit)(BiPTree))
QueueEmpty(q))
Visit(a);
=NULL)
intvisitT(BiPTreeT)
if(T)//T非空
printf("
%c是"
T->
data);
parent)//T有双亲
if(T->
lchild==T)
printf("
的左孩子\n"
);
else
的右孩子\n"
根结点\n"
intmain()
inti;
BiPTreeT,c,q;
TElemTypee1,e2;
InitBiTree(&
T);
printf("
构造空二叉树后,树空否?
%d(1:
是0:
否)树的深度=%d\n"
BiTreeEmpty(T),BiTreeDepth(T));
e1=Root(T);
if(e1!
=Nil)
二叉树的根为:
%c\n"
e1);
树空,无根\n"
请按先序输入二叉树(如:
ab三个空格表示a为根结点,b为"
"
左子树的二叉树)\n"
CreateBiTree(&
建立二叉树后,树空否?
中序递归遍历二叉树:
\n"
InOrderTraverse(T,visitT);
后序递归遍历二叉树:
PostOrderTraverse(T,visitT);
层序遍历二叉树:
LevelOrderTraverse(T,visitT);
请输入一个结点的值:
"
%*c"
%c%*c"
e1);
c=Point(T,e1);
//c为e1的指针
结点的值为%c\n"
Value(c));
欲改变此结点的值,请输入新值:
e2);
Assign(c,e2);
e1=Parent(T,e2);
%c的双亲是%c\n"
e2,e1);
%c没有双亲\n"
e2);
e1=LeftChild(T,e2);
%c的左孩子是%c\n"
%c没有左孩子\n"
e1=RightChild(T,e2);
%c的右孩子是%c\n"
%c没有右孩子\n"
e1=LeftSibling(T,e2);
%c的左兄弟是%c\n"
%c没有左兄弟\n"
e1=RightSibling(T,e2);
%c的右兄弟是%c\n"
%c没有右兄弟\n"
c);
构造一个右子树为空的二叉树c:
请先序输入二叉树(如:
ab三个空格表示a为根结点,b为左子树的二叉树)\n"
先序递归遍历二叉树c:
PreOrderTraverse(c,visitT);
树c插到树T中,请输入树T中树c的双亲结点c为左(0)或右
(1)子树:
%*c%c%d"
e1,&
i);
q=Point(T,e1);
InsertChild(q,i,c);
先序递归遍历二叉树:
PreOrderTraverse(T,visitT);
删除子树,请输入待删除子树的双亲结点左(0)或右
(1)子树:
DeleteChild(q,i);
DestroyBiTree(&
system("
pause"
输出效果:
1(1:
否)树的深度=0
树空,无根
ab三个空格表示a为根结点,b为左子树的二叉树)
ab
0(1:
否)树的深度=2
a
b是a的左孩子
a是根结点
结点的值为a
c
c是根结点
b是c的左孩子
c没有双亲
c的左孩子是b
c没有右孩子
c没有左兄弟
c没有右兄弟
AB
A是根结点
B是A的左孩子
c1
A是c的右孩子
A0
请按任意键继续...
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 二叉 三叉 存储 表示