ZZU的学弟学妹们不要抄作业哦~(`Д´)
一、实验目的
1.掌握二叉排序树的含义及其在计算机中的存储实现。
2.掌握在二叉排序树上查找操作的算法实现。
3.掌握二叉排序树的插入、删除操作的算法实现。
二、实验内容
1.建立二叉排序树。
2.在二叉排序树上实现对给定值进行查找操作。
3.在二叉排序树上实现插入、删除一个指定结点。
三、实验要求
1.建立二叉排序树。
按照输入的n个关键字序列顺序建立二叉排序树,二叉排序树采用二叉链表的存储结构。
2.在二叉排序树上实现对给定值进行查找操作。
先输入待查找记录的关键字值key,然后在二叉排序树上查找该记录,如果在二叉排序树中存在该记录,则显示“找到”的信息,否则显示“找不到”的信息。
3.在二叉排序树上实现插入、删除一个指定结点。
(1)输入待插入记录的关键字值key,然后在二叉排序树上查找该记录,如果查找失败,则在二叉排序树中插入该记录对应的结点,并输出插入操作后的二叉排序树(以中序遍历序列表示)。
(2)输入待删除记录的关键字值key,然后在二叉排序树上查找该记录,如果查找成功,则在二叉排序树中删除该记录对应的结点,并输出删除操作后的二叉排序树(以中序遍历序列表示)。
四、详细程序清单
//二叉排序树
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
int key;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
int SearchBST(BiTree T,int key,BiTree f,BiTree &p )//查找
{
if(!T) {p=f;return 0;}
else if (key==T->key) {p=T;return 1;}
else if(key<T->key) SearchBST(T->lchild,key,T,p);
else SearchBST(T->rchild,key,T,p);
}
int InsertBST(BiTree &T,int key)//插入
{
if(!T)
{
T=(BiTree)malloc(sizeof(BiTNode));
T->key=key;
T->lchild=(T)->rchild=NULL;
}
if(key==T->key) return 0;
if(key>T->key) InsertBST(T->rchild,key);
else InsertBST(T->lchild,key);
}
void InorderTraverse(BiTree T)//中序遍历
{
if(T)
{
InorderTraverse(T->lchild);
printf("%d ",T->key);
InorderTraverse(T->rchild);
}
}
void Delete(BiTree &p) //删除
{
BiTree q, s;
if(!p->lchild &&!p->rchild) //p为叶子节点
p = NULL;
else if(!p->lchild) //左子树为空,重接右子树
{
q=p;
p=p->rchild;
free(q);
}
else if(!p->rchild) //右子树为空,重接左子树
{
q=p;
p=p->lchild;
free(q);
}
else //左右子树均不为空
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->key=s->key;
if(q!=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
free(s);
}
}
int DeleteBST(BiTree &T, int key)//删除
{
if(!T) return 0;
else
{
if(key==T->key ) Delete(T);
else if(key<T->key) DeleteBST(T->lchild,key);
else DeleteBST(T->rchild,key);
}
}
int main()
{
int e,n;
BiTree T=NULL,f,p;
printf("输入长度:");
scanf("%d",&n);
printf("输入元素:");
while(n--)
{
scanf("%d",&e);
InsertBST(T, e);
}
printf("中序遍历:");
InorderTraverse(T);
printf("\n");
while(1)
{
printf("输入要查找元素:");
scanf("%d",&e);
if(SearchBST(T,e,f,p)) printf("找到了\n");
else printf("没找到\n");
printf("输入要插入元素:");
scanf("%d",&e);
InsertBST(T,e);
printf("中序遍历:");
InorderTraverse(T);
printf("\n");
printf("输入要删除元素:");
scanf("%d",&e);
DeleteBST(T,e);
printf("中序遍历:");
InorderTraverse(T);
printf("\n");
}
}
五、程序运行结果
六、实验心得体会
1. 啊。。。饿了,吃饭去了。