一、题目描述
用顺序和二叉链表作存储结构,完成二叉排序树的实现。
1、要求以回车(’\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T。
2、对二叉排序树T作中序遍历,输出结果。
3、输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;
二、程序设计
程序按功能分为5大模块,具体如下:
1 根据题目以二叉链表存储方式构建二叉树排序树。
2. 查找二叉排序树是否存在元素key,查找成功指针p指向该元素节点,否则指向查找路径上访问的最后一个结点
3. 若二叉排序树中存在元素e,删除该元素结点并连接好删除某个元素后的二叉排序树。44
4. 中序遍历二叉排序树
5. 构建main函数执行:输入相关数据、构建二叉树排序树、删除二叉排序树中元素e、中序遍历二叉排序树。 .
三、代码(附一些注释)
#include<stdio.h>
#include<stdlib.h>
typedef struct BitNode//二叉树的二叉链表存储表示
{
int data;
struct BitNode *lchild;
struct BitNode *rchild;
}BitNode,*BiTree;
void CreateBiTree(BiTree &T);//构建一个空二叉排序树
int SearchBST(BiTree T,int key,BiTree f,BiTree &p);//查找二叉排序树是否存在key元素,查找成功指针p指向该元素节点,
int InsertBST(BiTree &T,int e);//若二叉排序树中不存在元素e,在二叉排序树中插入元素e
int Delete(BiTree &p);//从二叉排序树中删除结点p,并重接其左右子树
int DeleteBST(BiTree &T,int e); // 若二叉排序树中存在元素e,删除该元素结点
int outputDFS(BiTree B);//中序遍历二叉排序树
int main()
{
int n,e;
BiTree T;//构造一个二叉排序树T
CreateBiTree(T);
printf("请输入要插入的元素个数:");
scanf("%d",&n);
printf("请依次输入要插入的元素:\n");
while(n--)
{
scanf("%d",&e);
InsertBST(T,e);
}
printf("对构造的二叉排序树进行中序遍历 如下:\n");
outputDFS(T);
printf("\n\n");
printf("请输入要删除的元素(输入0结束该操作):");
scanf("%d",&e);
while(e)
{
if(DeleteBST(T,e)==0) printf("无%d\n",e);
else printf("已删除%d\n",e);
printf("对删除后的二叉排序树进行中序遍历 如下:\n");
outputDFS(T);
printf("\n\n");
printf("请输入要删除的元素(输入0结束该操作):");
scanf("%d",&e);
}
return 0;
}
void CreateBiTree(BiTree &T)
{
T=NULL;
//T->lchild=T->rchild=NULL;
}
int SearchBST(BiTree T,int key,BiTree f,BiTree &p)
{
if(!T)
{
p=f;
return 0;
}
else if(key==T->data)
{
p=T;
return 1;
}
else if(key<T->data) return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
int InsertBST(BiTree &T,int e)
{
BiTree p;
if(!SearchBST(T,e,NULL,p))
{
BiTree s=(BiTree)malloc(sizeof(BitNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p) T=s;
else if(e<p->data) p->lchild=s;
else p->rchild=s;
return 1;
}
else return 0;
}
int Delete(BiTree &p)
{
BiTree q;
BiTree s;
if(!p->rchild)
{
q=p;
p=p->lchild;
free(q);
}
else if(!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;
delete s;
}
return 1;
}
int DeleteBST(BiTree &T,int e)
{
if(!T) return 0;
else
{
if(e==T->data) return Delete(T);
else if(e<T->data) return DeleteBST(T->lchild,e);
else return DeleteBST(T->rchild,e);
}
}
int outputDFS(BiTree B)
{
if(B==NULL) return 0;
outputDFS(B->lchild);
printf("%d ", B->data);
outputDFS(B->rchild);
}
四、运行结果