全线索二叉链表实验报告文档格式.docx
《全线索二叉链表实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《全线索二叉链表实验报告文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
附录(带源代码)
课题:
全线索链表应用
课题描述:
对二叉树的二叉链表结点增加两个指针域,前驱指针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