数据结构c语言课设二叉树排序 2.docx
- 文档编号:7532322
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:19
- 大小:76.21KB
数据结构c语言课设二叉树排序 2.docx
《数据结构c语言课设二叉树排序 2.docx》由会员分享,可在线阅读,更多相关《数据结构c语言课设二叉树排序 2.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构c语言课设二叉树排序2
题目:
二叉排序树的实现
1内容和要求
1)编程实现二叉排序树,包括生成、插入,删除;
2)对二叉排序树进行先根、中根、和后根非递归遍历;
3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?
2解决方案和关键代码
2.1解决方案:
先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。
前中后根遍历需要用到栈的数据结构,分模块编写栈与遍历代码。
要求对比二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock()函数记录查找时间来对比查找效率。
2.2关键代码
2.2.1树的基本结构定义及基本函数
typedefstruct
{
KeyTypekey;
}ElemType;
typedefstructBiTNode//定义链表
{
ElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree,*SElemType;
//销毁树
intDestroyBiTree(BiTree&T)
{
if(T!
=NULL)
free(T);
return0;
}
//清空树
intClearBiTree(BiTree&T)
{
if(T!
=NULL)
{
T->lchild=NULL;
T->rchild=NULL;
T=NULL;
}
return0;
}
//查找关键字,指针p返回
intSearchBST(BiTreeT,KeyTypekey,BiTreef,BiTree&p)
{
if(!
T)
{
p=f;
returnFALSE;
}
elseifEQ(key,T->data.key)
{
p=T;
returnTRUE;
}
elseifLT(key,T->data.key)
returnSearchBST(T->lchild,key,T,p);
else
returnSearchBST(T->rchild,key,T,p);
}
2.2.2二叉树的生成、插入,删除
生成
voidCreateBST(BiTree&BT,BiTreep)
{
inti;
ElemTypek;
printf("请输入元素值以创建排序二叉树:
\n");
scanf_s("%d",&k.key);
for(i=0;k.key!
=NULL;i++)
{
//判断是否重复
if(!
SearchBST(BT,k.key,NULL,p))
{
InsertBST(BT,k);
scanf_s("%d",&k.key);
}
else
{
printf("输入数据重复!
\n");
return;
}
}
}
插入
intInsertBST(BiTree&T,ElemTypee)
{
BiTrees,p;
if(!
SearchBST(T,e.key,NULL,p))
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!
p)
T=s;
elseifLT(e.key,p->data.key)
p->lchild=s;
else
p->rchild=s;
returnTRUE;
}
elsereturnFALSE;
}
删除
//某个节点元素的删除
intDeleteEle(BiTree&p)
{
BiTreeq,s;
if(!
p->rchild)//右子树为空
{
q=p;
p=p->lchild;
free(q);
}
elseif(!
p->lchild)//左子树为空
{
q=p;
p=p->rchild;
free(q);
}
else
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!
=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
deletes;
}
returnTRUE;
}
//整棵树的删除
intDeleteBST(BiTree&T,KeyTypekey)//实现二叉排序树的删除操作
{
if(!
T)
{
returnFALSE;
}
else
{
if(EQ(key,T->data.key))//是否相等
returnDeleteEle(T);
elseif(LT(key,T->data.key))//是否小于
returnDeleteBST(T->lchild,key);
else
returnDeleteBST(T->rchild,key);
}
return0;
}
2.2.3二叉树的前中后根遍历
栈的定义
typedefstruct
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
intInitStack(SqStack&S)//构造空栈
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
intPush(SqStack&S,SElemTypee)//插入元素e为新栈顶
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}//Push
intPop(SqStack&S,SElemType&e)//删除栈顶,应用e返回其值
{
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}//Pop
intStackEmpty(SqStackS)//判断是否为空栈
{
if(S.base==S.top)returnTRUE;
returnFALSE;
}
先根遍历
intPreOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))
{
SqStackS;
BiTreep;
InitStack(S);
p=T;
while(p||!
StackEmpty(S))
{
if(p)
{
Push(S,p);
if(!
Visit(p->data))returnERROR;
p=p->lchild;
}
else
{
Pop(S,p);
p=p->rchild;
}
}
returnOK;
}
中根遍历
intInOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))
{
SqStackS;
BiTreep;
InitStack(S);
p=T;
while(p||!
StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,p);
if(!
Visit(p->data))returnERROR;
p=p->rchild;
}
}
returnOK;
}
后根遍历
intPostOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))
{
SqStackS,SS;
BiTreep;
InitStack(S);
InitStack(SS);
p=T;
while(p||!
StackEmpty(S))
{
if(p)
{
Push(S,p);
Push(SS,p);
p=p->rchild;
}
else
{
if(!
StackEmpty(S))
{
Pop(S,p);
p=p->lchild;
}
}
}
while(!
StackEmpty(SS))
{
Pop(SS,p);
if(!
Visit(p->data))returnERROR;
}
returnOK;
}
2.2.4利用数组存储一个班学生信息
ElemTypea[]={51,"陈继真",88,
82,"黄景元",89,
53,"贾成",88,
44,"呼颜",90,
25,"鲁修德",88,
56,"须成",88,
47,"孙祥",87,
38,"柏有患",89,
9,"革高",89,
10,"考鬲",87,
31,"李燧",86,
12,"夏祥",89,
53,"余惠",84,
4,"鲁芝",90,
75,"黄丙庆",88,
16,"李应",89,
87,"杨志",86,
18,"李逵",89,
9,"阮小五",85,
20,"史进",88,
21,"秦明",88,
82,"杨雄",89,
23,"刘唐",85,
64,"武松",88,
25,"李俊",88,
86,"卢俊义",88,
27,"华荣",87,
28,"杨胜",88,
29,"林冲",89,
70,"李跃",85,
31,"蓝虎",90,
32,"宋禄",84,
73,"鲁智深",89,
34,"关斌",90,
55,"龚成",87,
36,"黄乌",87,
57,"孔道灵",87,
38,"张焕",84,
59,"李信",88,
30,"徐山",83,
41,"秦祥",85,
42,"葛公",85,
23,"武衍公",87,
94,"范斌",83,
45,"黄乌",60,
67,"叶景昌",99,
7,"焦龙",89,
78,"星姚烨",85,
49,"孙吉",90,
60,"陈梦庚",95,
};
2.2.5数组查询函数
voidArraySearch(ElemTypea[],intkey,intlength){
inti;
for(i=0;i<=length;i++){
if(key==a[i].key){
cout<<"学号:
"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构c语言课设二叉树排序 数据结构 语言 二叉 排序