xtu-数据结构实验3-二叉排序树的实现

一、题目描述  
用顺序和二叉链表作存储结构,完成二叉排序树的实现。
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);
}

四、运行结果在这里插入图片描述

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值