全线索二叉链表实验报告文档格式.docx

上传人:b****3 文档编号:13896318 上传时间:2022-10-14 格式:DOCX 页数:30 大小:92.24KB
下载 相关 举报
全线索二叉链表实验报告文档格式.docx_第1页
第1页 / 共30页
全线索二叉链表实验报告文档格式.docx_第2页
第2页 / 共30页
全线索二叉链表实验报告文档格式.docx_第3页
第3页 / 共30页
全线索二叉链表实验报告文档格式.docx_第4页
第4页 / 共30页
全线索二叉链表实验报告文档格式.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

全线索二叉链表实验报告文档格式.docx

《全线索二叉链表实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《全线索二叉链表实验报告文档格式.docx(30页珍藏版)》请在冰豆网上搜索。

全线索二叉链表实验报告文档格式.docx

附录(带源代码)

课题:

全线索链表应用

课题描述:

对二叉树的二叉链表结点增加两个指针域,前驱指针prior和后继指针next。

通过该结点构造全线索二叉链表。

课题要求:

设计一个全线索二叉链表的应用程序。

1)创建全线索二叉树。

2)完成全线索二叉树的主要基本操作。

3)给出简单应用实例。

输入输出形式:

本实验中全线索二叉树元素均为整形(int)。

程序功能:

1:

创建二叉树。

2:

对二叉树中序遍历进行全线索化。

3:

求树中任意元素的前驱、后继、左孩子、右孩子。

4:

对二叉树进行元素的插入和删除。

5:

对二叉树的清空操作。

测试数据:

测试的二叉树为如下

2

3

4

5

6

7

8

typedefstructBiThrNode{

intdata;

structBiThrNode*lchild,*rchild,*prior,*next;

}BiThrNode,*BiThrTree;

//抽象数据类型BiThrNode

typedefstruct{

ElemTypedata[100];

intStacksize;

}SqStack;

//抽象数据类型SqStack

void*InitStack(SqStack*p);

//初始化栈

intStackEmpty(SqStack*S);

//判断栈空

intPush(SqStack*S,ElemTypee);

//入栈

ElemTypePop(SqStack*S,ElemTypee);

//出栈

BiThrTreeCreatBiTree(BiThrTreep);

//二叉树的构建

BiThrTreeInOrderThreading(BiThrTreep);

//中序线索化

intInOrder(BiThrTreep);

//求中序序列

intqianqu(BiThrTreep);

//求前驱

inthouji(BiThrTreep);

//求后继

intzuohai(BiThrTreep);

//求左孩子

intyouhai(BiThrTreep);

//求右孩子

intInsert(BiThrTreep);

//插入元素

intDelete(BiThrTreep);

//删除元素

intClear(BiThrTreep);

//将二叉树清空

Intmain()//主函数调用上述函数求解相应问题

各模块的算法如下:

StatusInitStack(SqStack*p){

p.Stacksize=-1;

returnOK;

}

StatusStackEmpty(SqStack*S){

//判断栈空

if(p->

Stacksize=-1)

returnTURE;

elsereturnFALSE;

StatusPush(SqStack*S,ElemTypee){

//入栈

P->

Stacksize=p->

Stacksize+1;

data[p->

Stacksize]=e;

StatusPop(SqStack*S,ElemTypee){

//出栈

e=p->

Stacksize];

Stacksize-1;

returne;

StatusCreatBiTree(BiThrTreep){

//二叉树的构建

scanf(&

m);

if(m==0)p=NULL;

else{

if(!

(p=(BiThrTree)malloc(sizeof(BiThrNode))))exit(OVERFLOW);

//存储分配失败

p->

data=m;

prior=NULL;

next=NULL;

lchild=NULL;

rchild=NULL;

lchild=CreatBiTree(p->

lchild);

//递归构建左子树

rchild=CreatBiTree(p->

rchild);

//递归构建右子树

returnp;

//返回头节点

StatusInOrderThreading(BiThrTreep){

//中序线索化

InitStack(&

S);

(Thr=(BiThrTree)malloc(sizeof(BiThrNode))))

exit(OVERFLOW);

//存储分配失败

Thr->

data=0;

lchild=p;

//Thr为头节点

p1=p;

pre=Thr;

//pre为全局变量,指向p1的前一个节点

while(p1||!

StackEmpty(&

S)){

if(p1){

Push(&

S,p1);

p1=p1->

lchild;

//进栈

}

else{

p1=Pop(&

pre->

next=p1;

p1->

prior=pre;

pre=p1;

p1=p1->

rchild;

next=Thr;

//最后一个节点线索化

returnThr;

StatusInOrder(BiThrTreep){

//求中序序列

for(p1=p->

next;

p1!

=p;

next){

printf(p1->

data);

//输出节点值

求前驱、后继、左孩子、右孩子思路差距不大,下面以求前驱为例:

Statusqianqu(BiThrTreep){

//求前驱

e);

//输入要查找元素

for(p2=p->

p2->

data!

=0;

p2=p2->

next){//逐个检查树中元素

if(p2->

data==e){

p3=p2->

prior;

if(p3->

data==0){

Printf(“该点不存在中序前驱!

”);

break;

printf("

该点的中序前驱为:

"

);

printf(p3->

//输出e的前驱

break;

StatusInsert(BiThrTreep){

p2=(BiThrTree)malloc(sizeof(BiThrNode));

printf("

输入所要插入的节点:

a);

输入所要查找的节点:

b);

if(p1->

data==b)break;

if(p1==p)

该节点不存在!

\n"

switch(j){

case1:

{//插入元素作为左孩子

p2->

data=a;

prior=p1->

prior->

next=p2;

p1->

prior=p2;

lchild=p2;

case2:

{//插入元素作为右孩子

prior=p1;

next=p1->

next->

rchild=p2;

default:

exit(0);

}//switch

}//else

StatusDelete(BiThrTreep){

//删除元素

//输入要删除的元素

next){//逐个检查树中是否有此元素

data==a)break;

if(p1==p)printf("

该树中无此节点!

if(p1==p1->

rchild){//元素作为右孩子

free(p1);

//释放P1

lchild){//元素作为左孩子

//释放p1

}//Delete

StatusClear(BiThrTreep){

//将二叉树清空

for(p1=p->

p2!

){

p2=p1->

//释放节点p1

p1=p2;

free(p);

//释放头节点

对所遇到问题的解决方法及分析

1)建立二叉树时遇到问题:

输入时未使用0来表明无左右孩子,导致递归无法结束,原因是为理解递归建立二叉树的过程。

2)建立二叉树后进行相应问题的求解后,无法进行多次求解,经分析后采用子函数相互调用的方法顺利解决。

3)其余一些程序语法及逻辑错误,经组内成员严谨排查顺利解决

算法的时空分析及改进设想

1)算法时空分析:

相应算法的时间复杂度均为O(n)

2)改进设想:

1)可以使用函数指针来使用求前驱、后继、左孩子、右孩子

等子函数。

2)或许可以使用一子函数代替程序中实现多次求解的代码,

简化程序。

使用说明

如下依次输入得到原始二叉树:

然后进入菜单界面如下:

之后按步骤进行相应问题求解!

六:

第一项测试:

求6的前驱得到2,测试成功!

第二项测试:

求5的后继得到7,测试成功!

第三项测试:

求5的左孩子得到6,测试成功!

第四项测试:

求2的右孩子得到5,测试成功!

第五项测试:

将9插入做为6的左孩子,测试成功!

第六项测试:

删除节点4后求2的左孩子,结果不存在,测试成功!

第七项测试:

求中序序列得到42685713,测试成功!

BiThrTreeCreatBiTree(BiThrTree

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1