数据结构课程设计百度文档Word文档格式.docx

上传人:b****6 文档编号:17455556 上传时间:2022-12-01 格式:DOCX 页数:30 大小:430.21KB
下载 相关 举报
数据结构课程设计百度文档Word文档格式.docx_第1页
第1页 / 共30页
数据结构课程设计百度文档Word文档格式.docx_第2页
第2页 / 共30页
数据结构课程设计百度文档Word文档格式.docx_第3页
第3页 / 共30页
数据结构课程设计百度文档Word文档格式.docx_第4页
第4页 / 共30页
数据结构课程设计百度文档Word文档格式.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构课程设计百度文档Word文档格式.docx

《数据结构课程设计百度文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计百度文档Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构课程设计百度文档Word文档格式.docx

已经实现二叉树的线索化可选择'

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<

root,X1>

∈H,且存在D1上的关系

H1∈H若Dr≠φ则Dr中存在惟一的元素Xr<

root,Xr>

∈H,且存在Dr上的关系

Hr∈H,H={<

<

H1,Hr}

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)

{

\t1中序输出二叉树\n"

\t2进行二叉树线索化\n"

\t3进行插入操作\n"

\t4进行删除操作\n"

\t5输出线索二叉树\n"

\t0退出\n"

\t请选择:

"

scanf("

%d"

&

i);

switch(i)

case1:

Inorder(T);

break;

case2:

PreThread(T);

\t已经实现二叉树的线索化可选择'

查看线索\n"

case3:

Insert(T);

printf("

break;

case4:

T=DeleteNode(T);

case5:

PrintIndex(T);

default:

error\n\t请继续选择:

}

}

Bithptr*CreatTree()//创建二叉树

charch;

intfront,rear;

Bithptr*T,*s;

T=NULL;

front=1;

rear=0;

**********************************\n"

**\n"

线索二叉树的运算.*\n"

创建二叉树请依次输入@表示虚结点以#结束\n"

ch=getchar();

while(ch!

='

#'

s=NULL;

if(ch!

@'

s=(Bithptr*)malloc(sizeof(Bithptr));

s->

data=ch;

lchild=NULL;

rchild=NULL;

ltag=0;

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

rchild=s;

if(rear%2==1)

front++;

returnT;

voidInorder(Bithptr*T)//递归中序遍历

if(T)

if(T->

ltag!

=1)

Inorder(T->

lchild);

→%c"

T->

data);

rtag!

rchild);

Bithptr*p;

p=root;

if(p)

PreThread(p->

if(pre&

pre->

rtag==1)

pre->

rchild=p;

if(p->

lchild==NULL)

p->

ltag=1;

lchild=pre;

}

rchild==NULL)

rtag=1;

pre=p;

voidPrintIndex(Bithptr*t)//输出线索二叉树的线索

Bithptr*f;

f=t;

if(f)

if(f->

ltag==1&

f->

lchild==NULL&

[%c]"

f->

lchild!

%c→[%c]"

lchild->

data,f->

rchild!

rchild->

else

[%c]→%c"

=1)PrintIndex(f->

Bithptr*SearchChild(Bithptr*point,charfindnode)//查找数据结点

Bithptr*point1,*point2;

if(point!

if(point->

data==findnode)

returnpoint;

point1=SearchChild(point->

lchild,findnode);

if(point1!

returnpoint1;

point2=SearchChild(point->

rchild,findnode);

if(point2!

returnpoint2;

returnNULL;

Bithptr*SearchPre(Bithptr*point,Bithptr*child)//查找父亲结点

if((point->

=1&

point->

lchild==child)||(point->

rchild==child))

point1=SearchPre(point->

lchild,child);

if(point1!

=NULL)

point2=SearchPre(point->

rchild,child);

voidInsert(Bithptr*root)//插入结点

charc;

Bithptr*p1,*child,*p2;

请输入要插入的结点的信息:

%c"

c);

p1=(Bithptr*)malloc(sizeof(Bithptr));

p1->

data=c;

p1->

输入查找的结点信息:

ch);

child=SearchChild(root,ch);

if(child==NULL)

没有找到结点\n"

return;

发现结点%c\n"

child->

if(child->

ltag==0)

p2=child;

child=child->

lchild;

while(child->

rchild&

child->

rtag==0)

rchild

rchild=child->

rchild;

child->

rchild=p1;

lchild=child;

lchild=child->

lchild=p1;

rchild=child;

\n\t插入结点操作已经完成并同时完成了线索化的恢复\n"

Bithptr*DeleteNode(Bithptr*t)//删除结点

Bithptr*child,*pre,*s,*q;

ch=getchar();

child=SearchChild(t,ch);

if(NULL==child)

没有找到结点:

returnt;

if(child!

=t)

pre=SearchPre(t,child);

pre->

ltag=%d,rtag=%d\n"

ltag,child->

rtag);

t=NULL;

t=child->

free(child);

if(t->

t->

s=child->

while(s->

s->

s=s->

q=child->

while(q->

lchild&

q->

q=q->

q->

if(child==pre->

lchild||child==pre)

rchild=pre;

rchild)

lchild)

rtag==1)

lchild=q;

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

当前位置:首页 > 自然科学 > 数学

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

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