程序二叉树应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
二叉树的应用
一、实验目的
实现二叉排序树的应用。
二、实验内容(问题)
设计一个程序,实现二叉排序树的应用。基本要求:
(1)从空树开始,通过插入,建立一棵二叉排序树;
(2)检验所建立的二叉树是否是二叉排序树;
(3)实现二叉排序树的删除。
三、算法描述
(给出自然语言描述的算法)
1.建立一棵空树,把数据元素插入树中;
2.检验这棵树是不是二叉排序树;
3.输入一个关键字,删除该数据元素。
四、详细设计(画流程图)
五、程序代码
#include "stdio.h"
#include "stdlib.h"
#define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define FALSE 0
#define TRUE 1
typedef int Status;
typedef struct ElemType{
int key;
char name[15];
}ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
FILE *fp;
Status SearchBST(BiTree T,int key,BiTree f,BiTree &p); Status InsertBST(BiTree &T,ElemType e);
Status PreOrderTraverse(BiTree T,Status(*visit)(ElemType)); Status Show(ElemType e);
Status InspectBST(BiTree T);
Status DeleteBST(BiTree &T,int key);
Status Delete(BiTree &p);
main(){
BiTree T=NULL; ElemType e; int i,key;
if((fp=fopen("data.txt","read"))==NULL){
printf("Can't open file!\n");
exit(0);
}
for(i=0;i<16;i++){
fscanf(fp,"%d%s\n",&e.key,);
InsertBST(T,e);
}
fclose(fp);
printf("二叉排序树建立成功。\n");
if(InspectBST(T))printf("此二叉树是二叉排序树。\n");
else return FALSE;
printf("先序遍历序列是:\n");
if(PreOrderTraverse(T,Show))printf("\n");
for(i=0;i<3;i++){
printf("输入要删除数据元素的关键字:");
scanf("%d",&key);
if(DeleteBST(T,key)){
printf("删除该数据元素后的先序遍历是:\n");
PreOrderTraverse(T,Show);
printf("删除成功。\n");
}
else printf("二叉树中没有此数据元素,删除失败。\n");
}
return TRUE;
}
Status SearchBST(BiTree T,int key,BiTree f,BiTree &p){
if(!T){ //查找不成功
p=f; return FALSE;
}
else if(EQ(key,T->data.key)){ //查找成功
p=T; return TRUE;
}
else if LT(key,T->data.key)return SearchBST(T->lchild,key,T,p); //在左子树中继续查找else return SearchBST(T->rchild,key,T,p); //在左子树中继续查找
}
Status InsertBST(BiTree &T,ElemType e){
BiTree p,s;
if(!SearchBST(T,e.key,NULL,p)){ //查找不成功
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e; s->lchild=s->rchild=NULL;
if(!p)T=s; //被插结点*s为新的根结点
else if LT(e.key,p->data.key)p->lchild=s; //被插结点*s为左孩子
else p->rchild=s; //被插结点*s为左孩子
return TRUE;
}
else return FALSE; //树中已有关键字相同的结点,不再插入
}
Status DeleteBST(BiTree &T,int key){
if(!T)return FALSE; //不存在关键字等于key的数据元素
else{
if(EQ(key,T->data.key))return Delete(T); //找到关键字key的数据元素
else if(LT(key,T->data.key))return DeleteBST(T->lchild,key);
else return DeleteBST(T->rchild,key);
}
}
Status Delete(BiTree &p){
BiTree q,s;
if(!p->rchild){ //右子树空则只需重接它的左子树
q=p; p=p->lchild; free(q);