数据结构课程设计百度文档.docx
- 文档编号:4520903
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:30
- 大小:430.21KB
数据结构课程设计百度文档.docx
《数据结构课程设计百度文档.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计百度文档.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构课程设计XX文档
一、需求分析
1.问题描述
在这个问题中要解决的任务是实现线索二叉树的建立、插入、删除、恢复线索的实现.n个结点的二叉链表中含有n+1个空指针域。
利用二叉链表中的空指针域存放指向结点在某种遍历次序下的前趋和后继结点的指针。
加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。
线索性质的不同线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
在此次课程设计中采用的是中序线索二叉树。
2.基本功能
1定义数据结构2建立二叉树函数返回根指针3中序遍历
4:
中序线索化算法函数实现5输出线索6查找数据结点函数
7查找父亲结点函数8插入结点函数9删除结点函数。
3.输入输出
原始数据要求输入二叉树的七个结点abcdefg输入的是一个二叉树这就实现了
二叉树的建立过程。
然后对二叉树进行线索化。
对其进行插入在d结点插入结点h删
除删除结点f恢复线索等功能。
**********************************
**
*课程设计题目:
线索二叉树的运算.*
**
创建二叉树请依次输入@表示虚结点以#结束:
abcdef@@g
1中序输出二叉树
2进行二叉树线索化
3进行插入操作
4进行删除操作
5输出线索二叉树
0退出
请选择:
1
→d→g→b→e→a→f→c
1中序输出二叉树
2进行二叉树线索化
3进行插入操作
4进行删除操作
5输出线索二叉树
0退出
请选择:
2
已经实现二叉树的线索化可选择'5'查看线索
二、概要设计
1.设计思路
建立二叉树即指在内存中建立二叉树的存储结构建立一个二叉链表需按某种顺
序一次输入二叉树中的结点且输入顺序必须隐含结点间的逻辑结构信息。
对于一般的二
叉树需添加虚结点使其成为完全二叉树。
关键在于如何将新结点作为左孩子和右孩子连接到它的父结点上。
可以设置一个队列
该队列是一个指针类型的数组保存已输入的结点地址。
操作1令队头指针front指向其孩子结点当前输入的建立链接的父结点队尾指针
rear指向当前输入的结点初始front=1,rear=0;2若rear为偶数则该结点为父结
点的左孩子若rear为奇数则该结点的右孩子若父结点和孩子结点为虚结点则无需
链接。
3若父结点与其两个孩子结点的链接完毕则令front=front+1,使front指向下
一个等待链接的父结点。
二叉树的中序线索化算法与中序遍历算法类似。
只需要将遍历算法中访问结点的操作具
体化为建立正在访问的结点与其非空中序前趋结点间线索。
该算法应附设一个指针pre始
终指向刚刚访问过的结点pre的初值应为NULL而指针p指示当前正在访问的结点。
结
点*pre是结点*p的前趋而*p是*pre的后继。
结点插入算法由线索二叉树的定义易知插入的节点定是个叶子节点需注意线索的
修改可分为两种情况(1插入的节点t是右儿子t的中序后继是其父亲的中序后
继中序前驱是其父亲。
(2插入的节点t是左儿子t的中序前驱是其父亲的中序前
驱中序后继是其父亲。
结点删除算法删除的情况与搜索二叉树的删除的类似(1删除的节点p是叶子节
点直接删除修改其父亲的线索。
(2删除的节点p有一个儿子p有一个左儿子以
p为根的左子树中的具有最大值节点的t中序后继是p的中序后继中序前驱不变p有一
个右儿子以p为根的右子中的具有最小值节点t中序前驱是p的中序前驱中序后继不
变。
(3删除的节点p有二个儿子转化为叶子节点或只有一个儿子节点的删除。
2.数据结构设计抽象数据类型二叉树的定义如下
ADTBinaryTree{
数据对象DD是具有相同特性的数据元素的集合。
数据关系R
若D=φ则R=φ称BinaryTree为空二叉树
若D=φ则R=HH是如下二元关系
1在D中存在唯一的成为根的数据元素root它在关系H下无前驱
2若D—root≠φ则存在D—root=D1,Dr且D1∩Dr=φ
3若D1≠φ则D1中存在惟一的元素X1
H1∈H若Dr≠φ则Dr中存在惟一的元素Xr
Hr∈H,H={
4D1,H是一颗符合本定义的二叉树称为根的左子树DrHr
是一颗符合本定义的二叉树称为根的右子树。
基本操作P
*CreatTree()
操作结果建立二叉树树函数返回根指针
Inorder(*T)
初始条件二叉树已存在已知其根结点。
操作结果中序遍历输出各结点二叉树。
PreThread(*root)
初始条件二叉树已存在已知其根结点。
操作结果中序线索化二叉树。
PrintIndex(*t)
初始条件二叉树已存在已知其根结点。
操作结果输出线索二叉树的线索。
*SearchChild(*point,findnode)
初始条件二叉树已存在已知其根结点已知结点的数据。
操作结果返回数据对应的结点若不存在此结点则返回“空”。
*SearchPre(*point,*child)
初始条件二叉树已存在已知其根结点已知其孩子结点。
操作结果返回child父亲结点若不存在此结点则返回“空”。
Insert(*root)
初始条件二叉树已存在已知其根结点。
操作结果将要插入的结点插到要插的目标结点之前并实现它线索化的恢复若
目标结点不存在则输出“没有找到结点”。
*DeleteNode(*t)
初始条件二叉树已存在已知其根结点。
操作结果删除目标结点并实现它线索化的恢复若目标结点不存在则输出
“没有找到结点”。
3.软件结构设计
模块函数名返回类型形式参数类型[调用的函数所对应的序号]
1创建二叉树CreatTree,void,
2中序遍历二叉树Inorder,void,Bithptr*T
3中序线索化二叉树PreThread,void,Bithptr*root
4)输出线索二叉树PrintIndex,void,Bithptr*t
5)查找数据结点SearchChild,Bithptr,Bithptr*point\charfindnode
6)查找父亲结点SearchPre,Bithptr,Bithptr*point\Bithptr*child
7)插入结点Insert,void,Bithptr*root[5]
8)删除结点DeleteNode,Bithptr,Bithptr*t[5,6]
9)主程序模块(main,void,)[1,2,3,4,7,8]
三、详细设计
1.结点类型
typedefstructnode
{
intltag,rtag;
structnode*lchild,*rchild;
chardata;
}Bithptr;//结点
2.二叉树的实现
void*CreatTree()
//建立二叉树
voidInorder(Bithptr*T)
//中序遍历二叉树
3.线索二叉树的实现
voidPreThread(Bithptr*root)
//中序线索化二叉树
voidPrintIndex(Bithptr*t)
//输出线索二叉树
voidInsert(Bithptr*root)
//插入结点
voidDeleteNode(Bithptr*root)
//删除结点
4.全局变量
Bithptr*Q[maxsize];
Bithptr*pre=NULL;
5.主函数
voidmain()
{
Bithptr*T;
inti;
T=CreatTree();
printf("\n");
i=1;
while(i)
{
printf("\t1中序输出二叉树\n");
printf("\t2进行二叉树线索化\n");
printf("\t3进行插入操作\n");
printf("\t4进行删除操作\n");
printf("\t5输出线索二叉树\n");
printf("\t0退出\n");
printf("\t请选择:
");
scanf("%d",&i);
printf("\n");
switch(i)
{
case1:
Inorder(T);
printf("\n");
break;
case2:
PreThread(T);
printf("\t已经实现二叉树的线索化可选择'5'查看线索\n");
printf("\n");
break;
case3:
Insert(T);printf("\n");break;
case4:
T=DeleteNode(T);printf("\n");break;
case5:
PrintIndex(T);break;
default:
printf("error\n\t请继续选择:
");
}
}
}
Bithptr*CreatTree()//创建二叉树
{
charch;
intfront,rear;
Bithptr*T,*s;
T=NULL;
front=1;rear=0;
printf("**********************************\n");
printf("**\n");
printf("*课程设计题目:
线索二叉树的运算.*\n");
printf("**\n");
printf("**********************************\n");
printf("创建二叉树请依次输入@表示虚结点以#结束\n");
ch=getchar();
while(ch!
='#')
{
s=NULL;
if(ch!
='@')
{
s=(Bithptr*)malloc(sizeof(Bithptr));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
s->ltag=0;
s->rtag=0;
}
rear++;
Q[rear]=s;
if(rear==1)
T=s;
else
{
if(s!
=NULL&&Q[front]!
=NULL)
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
if(rear%2==1)
front++;
}
ch=getchar();
}
returnT;
}
voidInorder(Bithptr*T)//递归中序遍历
{
if(T)
{
if(T->ltag!
=1)
Inorder(T->lchild);
printf("→%c",T->data);
if(T->rtag!
=1)
Inorder(T->rchild);
}
}
Bithptr*pre=NULL;
voidPreThread(Bithptr*root)
{
Bithptr*p;
p=root;
if(p)
{
PreThread(p->lchild);
if(pre&&pre->rtag==1)
pre->rchild=p;
if(p->lchild==NULL)
{
p->ltag=1;
p->lchild=pre;
}
if(p->rchild==NULL)
p->rtag=1;
pre=p;
PreThread(p->rchild);
}
}
voidPrintIndex(Bithptr*t)//输出线索二叉树的线索
{
Bithptr*f;
f=t;
if(f)
{
if(f->ltag==1&&f->lchild==NULL&&f->rtag==1)
printf("[%c]",f->data);
if(f->ltag==1&&f->lchild!
=NULL)
printf("%c→[%c]",f->lchild->data,f->data);
if(f->ltag==1&&f->rchild!
=NULL&&f->rtag==1)
printf("→%c",f->rchild->data);
else
if(f->rchild!
=NULL&&f->rtag==1)
printf("[%c]→%c",f->data,f->rchild->data);
printf("\n");
if(f->ltag!
=1)PrintIndex(f->lchild);
if(f->rtag!
=1)PrintIndex(f->rchild);
}
}
Bithptr*SearchChild(Bithptr*point,charfindnode)//查找数据结点
{
Bithptr*point1,*point2;
if(point!
=NULL)
{
if(point->data==findnode)
returnpoint;
else
if(point->ltag!
=1)
{
point1=SearchChild(point->lchild,findnode);
if(point1!
=NULL)
returnpoint1;
}
if(point->rtag!
=1)
{
point2=SearchChild(point->rchild,findnode);
if(point2!
=NULL)
returnpoint2;
}
returnNULL;
}
else
returnNULL;
}
Bithptr*SearchPre(Bithptr*point,Bithptr*child)//查找父亲结点
{
Bithptr*point1,*point2;
if(point!
=NULL)
{
if((point->ltag!
=1&&point->lchild==child)||(point->rtag!
=1&&point->rchild==child))
returnpoint;
else
if(point->ltag!
=1)
{
point1=SearchPre(point->lchild,child);
if(point1!
=NULL)
returnpoint1;
}
if(point->rtag!
=1)
{
point2=SearchPre(point->rchild,child);
if(point2!
=NULL)
returnpoint2;
}
returnNULL;
}
else
returnNULL;
}
voidInsert(Bithptr*root)//插入结点
{
charch;
charc;
Bithptr*p1,*child,*p2;
printf("请输入要插入的结点的信息:
");
scanf("%c",&c);
scanf("%c",&c);
p1=(Bithptr*)malloc(sizeof(Bithptr));
p1->data=c;
p1->lchild=NULL;
p1->rchild=NULL;
p1->ltag=0;
p1->rtag=0;
printf("输入查找的结点信息:
");
scanf("%c",&ch);
scanf("%c",&ch);
child=SearchChild(root,ch);
if(child==NULL)
{
printf("没有找到结点\n");
return;
}
else
printf("发现结点%c\n",child->data);
if(child->ltag==0)
{
p2=child;
child=child->lchild;
while(child->rchild&&child->rtag==0)
child=child->rchild
p1->rchild=child->rchild;
p1->rtag=1;
child->rtag=0;
child->rchild=p1;
p1->lchild=child;
p1->ltag=1;
}
else
{
p1->lchild=child->lchild;
child->ltag=0;
p1->ltag=1;
child->lchild=p1;
p1->rchild=child;
p1->rtag=1;
}
printf("\n\t插入结点操作已经完成并同时完成了线索化的恢复\n");
}
Bithptr*DeleteNode(Bithptr*t)//删除结点
{
Bithptr*child,*pre,*s,*q;
charch;
printf("输入查找的结点信息:
");
ch=getchar();
ch=getchar();
child=SearchChild(t,ch);
if(NULL==child)
{
printf("没有找到结点:
");
returnt;
}
if(child!
=t)
{
pre=SearchPre(t,child);
printf("发现结点%c\n",pre->data);
printf("ltag=%d,rtag=%d\n",child->ltag,child->rtag);
}
else
if(child->ltag==1&&child->rtag==1)
t=NULL;
else
if(child->ltag==1&&child->rtag!
=1)
{
t=child->rchild;
child->rchild->lchild=NULL;
free(child);
returnt;
}
else
if(t->ltag!
=1&&t->rtag==1)
{
t=child->lchild;
child->lchild->rchild=NULL;
free(child);
returnt;
}
else
if(t->ltag!
=1&&t->rtag!
=1)
{
t=child->lchild;
s=child->lchild;
while(s->rchild&&s->rtag!
=1)
s=s->rchild;
q=child->rchild;
while(q->lchild&&q->ltag!
=1)
q=q->lchild;
s->rchild=child->rchild;
s->rtag=0;
q->lchild=s;
free(child);
returnt;
}
if(child==pre->lchild||child==pre)
{
if(child->ltag==1&&child->rtag==1)
{
pre->lchild=child->lchild;
pre->ltag=1;
if(child->lchild!
=NULL)
if(child->lchild->rtag==1)
child->lchild->rchild=pre;
free(child);
}
else
if(child->ltag!
=1&&child->rtag!
=1)
{
pre->lchild=child->lchild;
s=child->lchild;
while(s->rchild)
s=s->rchild;
s->rchild=child->rchild;
free(child);
}
else
if(child->ltag==1&&child->rtag!
=1)
{
pre->lchild=child->rchild;
s=child->rchild;
while(s->lchild)
s=s->lchild;
s->lchild=child->lchild;
if(child->lchild!
=NULL)
if(child->lchild->rtag==1)
child->lchild->rchild=pre;
free(child);
}
else
if(child->ltag!
=1&&child->rtag!
=1)
{
pre->lchild=child->lchild;
s=child->rchild;
while(s->lchild&&s->ltag!
=1)
s=s->lchild;
q=child->lchild;
while(q->rchild&&q->rtag!
=1)
q=q->rchild;
q->rchild=child->rchild;
q->rtag=0;
s->lchild=q;
free(child);
}
}
else
{
if(child==pre->rchild)
{
if(child->ltag==1&&child->rtag==1)
{
pre->rchild=child->rchild;
pre->rtag=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 百度 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)