二叉树及其应用算法与数据结构课程设计Word格式.docx
- 文档编号:7812947
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:22
- 大小:377.57KB
二叉树及其应用算法与数据结构课程设计Word格式.docx
《二叉树及其应用算法与数据结构课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《二叉树及其应用算法与数据结构课程设计Word格式.docx(22页珍藏版)》请在冰点文库上搜索。
具体编程时,用变量n保存当前访问的节点的层次数目并初始化为1,front和rear是数组queue中当前正在访问的节点的下标以及可插入节点的下标,而flag起到标志作用用来表明是否要增加当前的层次数n。
算法开始时,首先判断树是否为空,若为空树退出程序;
若树不为空,则先判断根节点的值是否与要查找节点的值相等,若相等则返回n,否则将当前层次n加1,并将根节点的左孩子、右孩子以及根节点本身插入到数组queue中。
可能,有人会问为什么还要将根节点插入到数组queue中?
这里,将根节点插入到数组queue中的目的是,当queue[front]保存的是根节点的指针时,二叉树的一层节点遍历结束了,需要将当前层次数n加1并让queue[rear]保存根节点的指针。
算法的核心部分就是while循环里面的内容,首先让标志flag值为0,如果queue[front]不为空且queue[front]->
data的值等于要查找的值c,程序结束返回n即可;
若queue[front]的值是指向根节点的指针,表明当前层次上的所有节点都已经访问过了,要访问下一个层次的节点了,故要把n加1并让flag值为1以表明在数组的插入位置queue[rear]需要赋值为跟节点的指针;
如果,均不是上述情况,则将queue[front]的左孩子、右孩子都放到数组queue中,并将front指向下一个元素。
重复上述循环,直到找到了要查找的值,或者遍历了所有的节点。
3、同学录的实现
本题的一个实际应用是实现同学录,我们采用二叉树存储结构,利用预置数组建立二叉树;
先序方式遍历二叉树并输出;
递归算法实现对同学录的查找;
基于查找实现对同学录的修改和新增成员;
求所要操作节点的父亲节点,从而顺利的编写对同学录的删除操作。
五、模块划分:
1、在顺序二叉树下求节点所在层次数
(1)voidCreattree()其功能是建立顺序二叉树;
(2)voidCengcitree()其功能是求节点层次
2、在链式二叉树下求节点所在层次数
(1)intCreateBiTree(BiTreeLink*T)其功能是建立二叉树;
(2)voidPreOrderTraverse(BiTreeLinkT)其功能是先序遍历二叉树;
(3)intCengciTree(BiTreeLinkT,charc)其功能是求层次数
(1)intn=0,front=0,rear=0,flag;
初始化队列;
(2)(front+1)%MAXSIZE!
=rear判断队列不满。
3、以同学录为例,利用二叉树存储结构,实现建立、查找、新增、删除等功能。
(1)voidCreateBiTree(DataType*items,BiTree*T)其功能是建立同学录
(2)voidPreOrderTraverse(BiTreeT)
(3)PBTNodeSearchTree(BiTreeT,char*ch)
(4)voidModifyTree(BiTreeT)
(5)voidDeleteTree(BiTreeT)
4、main()主函数,功能是调要相关函数实现问题的求解。
六、数据结构:
1、二叉树的抽象数据类型结构定义:
typedefstructNode
{TElemTypedata;
structNode*lchild,*rchild;
}BiTNode,*BiTreeLink;
2、同学录节点信息:
typedefstructInfo{
charname[20];
//姓名
chardate[11];
//生日
charphone[12];
//电话
charStudentNum[11];
//学号
}DataType;
3、同学录数据存储结构:
{DataTypedata;
structNode*left,*right;
}BTNode,*PBTNode,*BiTree;
七、源程序:
#definemaxlen100
#include"
stdio.h"
typedefstructnode
{chardata;
}Bitree[maxlen];
intN;
BitreeT;
/*建立二叉树*/
voidCreattree()
{inti;
charc;
printf("
请输入结点数目(包括空结点):
"
);
scanf("
%d"
&
N);
请输入结点(空结点为0):
for(i=1;
i<
=N;
i++)
{
scanf("
%s"
c);
T[i].data=c;
}
}
/*求二叉树节点所在层次*/
voidCengcitree()
{
inti,m=0,count=1;
请输入某一结点:
i=1;
while(i<
=N)
{
if(T[i].data==c){m=i;
break;
i++;
}
if(m==0)
\n节点不存在"
while(m!
=1)
m=m/2;
count++;
printf("
\n节点所在层次:
%d\n"
count);
/*主函数*/
voidmain()
Creattree();
Cengcitree();
#include"
#include<
stdlib.h>
malloc.h>
#defineMAXSIZE20
#defineNULL0
typedefcharTElemType;
/*二叉链树的类型定义*/
typedefstructBiTNode
structBiTNode*lchild,*rchild;
/*先序建立二叉树*/
intCreateBiTree(BiTreeLink*T)
{charch;
%c"
ch);
if(ch=='
'
)
*T=NULL;
else
{*T=(BiTreeLink)malloc(sizeof(BiTNode));
if(!
(*T))return0;
/*未分配到空间错误返回*/
(*T)->
data=ch;
CreateBiTree(&
(*T)->
lchild);
rchild);
return1;
/*先序遍历二叉树*/
voidPreOrderTraverse(BiTreeLinkT)
{if(T)
{printf("
T->
data);
PreOrderTraverse(T->
/*求二叉树节点所在层次数*/
intCengciTree(BiTreeLinkT,charc)
intn=1,front=0,rear=0,flag;
BiTreeLinkqueue[MAXSIZE];
//
if(!
T)
树为空!
\n"
returnn;
if(T->
data==c)
queue[rear++]=T->
lchild;
queue[rear++]=T->
rchild;
queue[rear++]=T;
n++;
while((front+1)%MAXSIZE!
=rear)
flag=0;
if(queue[front]&
&
queue[front]->
data==c)returnn;
if(queue[front]==T)
{
n++;
flag=1;
elseif(queue[front])
queue[rear]=queue[front]->
rear=(rear+1)%MAXSIZE;
if(flag)
queue[rear]=T;
front=(front+1)%MAXSIZE;
\n元素%c不存在。
c);
return-1;
/****主函数****/
intmain()
{
BiTreeLinkT;
intc=0;
charx;
请输入节点\n"
T);
\n先序:
PreOrderTraverse(T);
\n请输入节点:
getchar();
\n请输入要查询的字符:
x);
\n所在层次%3d\n\n"
CengciTree(T,x));
system("
pause"
return0;
stdlib.h"
string.h"
/****二叉链树的类型定义****/
/*****插入(左孩子)****/
PBTNodeInsertLeft(PBTNodeT,DataTypex)
{PBTNodep;
T)returnNULL;
if(T->
left==NULL)
{p=(PBTNode)malloc(sizeof(BTNode));
p->
data=x;
left=NULL;
right=NULL;
T->
left=p;
returnp;
returnNULL;
/*****插入(右孩子)****/
PBTNodeInsertRight(PBTNodeT,DataTypex)
right==NULL)
right=p;
/*****插入****/
voidInsertChild(PBTNodeT,DataTypex)
{if(T->
left==NULL&
right==NULL&
!
strcmp(T->
data.name,"
无"
))
{T->
elseif(InsertLeft(T,x))return;
else{
if(InsertRight(T,x))return;
elseInsertChild(T->
left,x);
/****建立二叉树****/
voidCreateBiTree(DataType*items,BiTree*T)
本程序通过预置数组建立二叉树\n"
(*T)=(PBTNode)malloc(sizeof(BTNode));
left=NULL;
right=NULL;
data=items[0];
4;
{InsertChild(*T,items[i]);
/****先序遍历二叉树****/
voidPreOrderTraverse(BiTreeT)
{printf("
\n\t姓名\t\t学号\t\t生日\t\t电话\n"
\n\t%s\t%s\t%s\t%s\n\n"
data.name,T->
data.StudentNum,T->
data.date,T->
data.phone);
left);
right);
/****查找二叉树****/
PBTNodeSearchTree(BiTreeT,char*ch)
{PBTNodeflag=NULL;
if(T)
{if(!
data.name,ch))
{printf("
flag=T;
returnflag;
elseflag=SearchTree(T->
left,ch);
if(flag)returnflag;
else
flag=SearchTree(T->
right,ch);
/****查找父亲节点****/
PBTNodeSearchFather(PBTNoder,BiTreeT,int*flag)
{PBTNodep=NULL;
if(T)
{if(T->
left==r)
{(*flag)=0;
p=T;
returnp;
}//flag=0表示左孩子的父亲
elseif(T->
right==r)
{(*flag)=1;
{p=SearchFather(r,T->
left,flag);
if(p)returnp;
elsep=SearchFather(r,T->
right,flag);
/****修改二叉树****/
voidModifyTree(BiTreeT)
{charch[20],Mod[12];
PBTNodeModifyNode;
intcaseflag;
请输入要修改信息的姓名:
ch);
ModifyNode=SearchTree(T,ch);
ModifyNode)
\n查找的姓名不存在\n"
{while
(1){
\n\
1.修改生日\n\
2.修改电话\n\
3.修改学号\n\
4.不修改\n"
caseflag);
switch(caseflag)
{case1:
请输入修改后的生日:
Mod);
strcpy(ModifyNode->
data.date,Mod);
case2:
请输入修改后的电话:
data.phone,Mod);
case3:
请输入修改后的学号:
data.StudentNum,Mod);
case4:
return;
/****删除二叉树****/
voidDeleteTree(BiTreeT)
{charch[20];
PBTNodeDelNodeFather,DelNode,p,q;
intflag;
请输入要删除信息的姓名:
DelNode=SearchTree(T,ch);
DelNode)
{if(T==DelNode)
{if(DelNode->
left)
{p=DelNode->
left;
while(p->
right)
{p=p->
right;
p->
right=DelNode->
q=DelNode->
*DelNode=*q;
q->
free(q);
elseif(DelNode->
{q=DelNode->
*DelNode=*q;
q->
free(q);
else{strcpy(T->
data.name,"
strcpy(T->
data.StudentNum,"
data.date,"
data.phone,"
else
{DelNodeFather=SearchFather(DelNode,T,&
flag);
if(DelNode->
while(p->
p->
else{q=DelNode->
if(q)
{*DelNode=*q;
q->
free(q);
else{free(DelNode);
if(flag==0)DelNodeFather->
if(flag==1)DelNodeFather->
}
\n删除指定姓名后的同学录\n"
{BiTreeT;
Intcaseflag;
charch[20];
DataTypex={"
周五"
1983-05-05"
15855555555"
0807011005"
};
DataTypeitems[4]={
{"
},
{"
}};
CreateBiTree(items,&
\n先序遍历:
while
(1){
1.按姓名查找\n\
2.新增同学信息\n\
3.修改同学信息\n\
4.删除同学信息\n\
5.退出\n\n"
请输入要查找的姓名:
if(!
SearchTree(T,ch))
printf("
break;
\n新增:
Ins
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 及其 应用 算法 数据结构 课程设计