大二的最后一个作业,等明天再过去答辩完后,我的大二也就基本告一段落。这次的课设没有怎么用心,所以也基本就是应付式的完成的,不过其中还是有挺多东西可以学的,因此就趁着刚写完,认真整理一下,方便以后学习。

接下进入正题

题目要求

利用平衡二叉树实现一个动态查找表

(1)     实现动态查找表的三种基本功能:查找,插入和删除;

(2)     合并两棵平衡二叉树;

(3)     把一棵平衡二叉树分裂成两棵平衡二叉树,使得在一棵树中的所有关键字都小于多等于X,另一棵树中的任一关键字都大于X。

完成说明

课设是基于c/c++语言编写的,开发平台选择的是vc6.0。(汗,我到现在都还只会用vc,当然也用过TC,不过那个古董级的真心用不惯),另外c语言也没学过界面,所以就只能用dos,凑合着看吧。 

概要设计

typedef int Status;

typedef int ElemType;

typedef struct BSTNode{

ElemType data;

int bf;

struct BSTNode *lchild ,*rchild;

} BSTNode,* BSTree;

 

Status SearchBST(BSTree T,ElemType e)//查找

void R_Rotate(BSTree &p)//右旋

void L_Rotate(BSTree &p)//左旋

void LeftBalance(BSTree &T)//插入平衡调整

void RightBalance(BSTree &T)//插入平衡调整

Status InsertAVL(BSTree &T,ElemType e,int &taller)//插入

void DELeftBalance(BSTree &T)//删除平衡调整

void DERightBalance(BSTree &T)//删除平衡调整

Status Delete(BSTree &T,int &shorter)//删除操作

Status DeleteAVL(BSTree &T,ElemType e,int &shorter)//删除操作

void merge(BSTree &T1,BSTree &T2)//合并操作

void splitBSTree(BSTree T,ElemType e,BSTree &T1,BSTree &T2)//分裂操作

void PrintBSTree(BSTree &T,int lev)//凹入表显示

接下来附上所有源码

#include<stdio.h>
#include<stdlib.h>
//#define TRUE 1
//#define FALSE 0
//#define OK 1
//#define ERROR 0
#define LH +1
#define EH 0
#define RH -1

typedef int Status;
typedef int ElemType;
typedef struct BSTNode{
ElemType data;
int bf;
struct BSTNode *lchild ,*rchild;
} BSTNode,* BSTree;

/*
查找算法
*/
Status SearchBST(BSTree T,ElemType e){
if(!T){
return FALSE; //查找失败
}
else if(e == T->data ){
return TRUE; //查找成功
}
else if (e < T->data){
return SearchBST(T->lchild,e);
}
else{
return SearchBST(T->rchild,e);
}
}

//右旋
void R_Rotate(BSTree &p){
BSTree lc;
lc = p->lchild;
p->lchild = lc->rchild;
lc->rchild = p;
p = lc;

}
//左旋
void L_Rotate(BSTree &p){
BSTree rc;
rc = p->rchild;
p->rchild = rc->lchild;
rc->lchild = p;
p = rc;
}

void LeftBalance(BSTree &T){
BSTree lc,rd;
lc=T->lchild;
switch(lc->bf){
case LH:
T->bf = lc->bf=EH;
R_Rotate(T);
break;
case RH:
rd=lc->rchild;
switch(rd->bf){
case LH: T->bf=RH; lc->bf=EH;
break;
case EH: T->bf=lc->bf=EH;
break;
case RH: T->bf=EH; lc->bf=LH;
break;
}
rd->bf=EH;
L_Rotate(T->lchild);
R_Rotate(T);
}
}

void RightBalance(BSTree &T)
{
BSTree rc,ld;
rc=T->rchild;
switch(rc->bf){
case RH:
T->bf= rc->bf=EH;
L_Rotate(T);
break;
case LH:
ld=rc->lchild;
switch(ld->bf){
case LH: T->bf=RH; rc->bf=EH;
break;
case EH: T->bf=rc->bf=EH;
break;
case RH: T->bf = EH; rc->bf=LH;
break;
}
ld->bf=EH;
R_Rotate(T->rchild);
L_Rotate(T);
}
}
//插入结点
Status InsertAVL(BSTree &T,ElemType e,int &taller){
if(!T){
T= (BSTree) malloc (sizeof(BSTNode));
T->data = e;
T->lchild = T->rchild = NULL;
T->bf = EH;
taller = 1;
}
else{
if(e == T->data){
taller = 0;
return ERROR;
}
if(e < T->data){
if(!InsertAVL(T->lchild,e,taller))
return ERROR;
if(taller)
switch(T->bf){
case LH:
LeftBalance(T);
taller = 0;
break;
case EH:
T->bf = LH;
taller = TRUE;
break;
case RH:
T->bf = EH;
taller = FALSE;
break;
}
}
else{
if (!InsertAVL(T->rchild,e,taller)){
return ERROR;
}
if(taller)
switch(T->bf){
case LH:
T->bf = EH;
taller = FALSE;
break;
case EH:
T->bf = RH;
taller = TRUE;
break;
case RH:
RightBalance(T);
taller = FALSE;
break;
}
}
}
return 1;
}
void DELeftBalance(BSTree &T){
BSTree lc,rd;
lc=T->lchild;
switch(lc->bf){
case LH:
T->bf = EH;
//lc->bf= EH;
R_Rotate(T);
break;
case EH:
T->bf = EH;
lc->bf= EH;
R_Rotate(T);
break;
case RH:
rd=lc->rchild;
switch(rd->bf){
case LH: T->bf=RH; lc->bf=EH;
break;
case EH: T->bf=lc->bf=EH;
break;
case RH: T->bf=EH; lc->bf=LH;
break;
}
rd->bf=EH;
L_Rotate(T->lchild);
R_Rotate(T);
}
}

void DERightBalance(BSTree &T)
{
BSTree rc,ld;
rc=T->rchild;
switch(rc->bf){
case RH:
T->bf= EH;
//rc->bf= EH;
L_Rotate(T);
break;
case EH:
T->bf= EH;
//rc->bf= EH;
L_Rotate(T);
break;
case LH:
ld=rc->lchild;
switch(ld->bf){
case LH: T->bf=RH; rc->bf=EH;
break;
case EH: T->bf=rc->bf=EH;
break;
case RH: T->bf = EH; rc->bf=LH;
break;
}
ld->bf=EH;
R_Rotate(T->rchild);
L_Rotate(T);
}
}

void SDelete(BSTree &T,BSTree &q,BSTree &s,int &shorter){

if(s->rchild){
SDelete(T,s,s->rchild,shorter);
if(shorter)
switch(s->bf){
case EH:
s->bf = LH;
shorter = 0;
break;
case RH:
s->bf = EH;
shorter = 1;
break;
case LH:
DELeftBalance(s);
shorter = 0;
break;
}
return;
}

T->data = s->data;
if(q != T)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
shorter = 1;

}
//删除结点
Status Delete(BSTree &T,int &shorter){
BSTree q;
if(!T->rchild){
q = T;
T = T->lchild;
free(q);
shorter = 1;
}
else if(!T->lchild){
q = T;
T= T->rchild;
free(q);
shorter = 1;
}
else{
SDelete(T,T,T->lchild,shorter);
if(shorter)
switch(T->bf){
case EH:
T->bf = RH;
shorter = 0;
break;
case LH:
T->bf = EH;
shorter = 1;
break;
case RH:
DERightBalance(T);
shorter = 0;
break;
}
}
return TRUE;
}

Status DeleteAVL(BSTree &T,ElemType e,int &shorter){
int sign = 0;
if (!T){
return sign;
}
else{
if(e == T->data){
sign = Delete(T,shorter);
return sign;
}

else if(e < T->data){
sign = DeleteAVL(T->lchild,e,shorter);
if(shorter)
switch(T->bf){
case EH:
T->bf = RH;
shorter = 0;
break;
case LH:
T->bf = EH;
shorter = 1;
break;
case RH:
DERightBalance(T);
shorter = 0;
break;
}

return sign;
}

else{
sign = DeleteAVL(T->rchild,e,shorter);
if(shorter)
switch(T->bf){
case EH:
T->bf = LH;
shorter = 0;
break;
case RH:
T->bf = EH;
break;
case LH:
DELeftBalance(T);
shorter = 0;
break;
}
return sign;
}

}
}
//合并
void merge(BSTree &T1,BSTree &T2){
int taller = 0;
if(!T2)
return;
merge(T1,T2->lchild);
InsertAVL(T1,T2->data,taller);
merge(T1,T2->rchild);

}
void split(BSTree T,ElemType e,BSTree &T1,BSTree &T2){
int taller = 0;
if(!T)
return;
split(T->lchild,e,T1,T2);
if(T->data > e)
InsertAVL(T2,T->data,taller);
else
InsertAVL(T1,T->data,taller);
split(T->rchild,e,T1,T2);

}
//分裂
void splitBSTree(BSTree T,ElemType e,BSTree &T1,BSTree &T2){
BSTree t1 = NULL,t2 = NULL;
split(T,e,t1,t2);
T1 = t1;
T2 = t2;
return;
}

//构建
void CreatBSTree(BSTree &T){
int num,i,e,taller = 0;
printf("输入结点个数:");
scanf("%d",&num);
printf("请顺序输入结点值\n");
for(i = 0 ;i < num;i++){
printf("第%d个结点的值",i+1);
scanf("%d",&e);
InsertAVL(T,e,taller) ;
}
printf("构建成功,输入任意字符返回\n");
getchar();
getchar();

}
//凹入表形式显示方法
void PrintBSTree(BSTree &T,int lev){
int i;
if(T->rchild)
PrintBSTree(T->rchild,lev+1);
for(i = 0;i < lev;i++)
printf(" ");
printf("%d\n",T->data);
if(T->lchild)
PrintBSTree(T->lchild,lev+1);
}

void Start(BSTree &T1,BSTree &T2){

int cho,taller,e,k;
taller = 0;
k = 0;
while(1){
system("cls");
printf(" 平衡二叉树操作的演示 \n\n");
printf("******************************************************************************\n");
printf(" 平衡二叉树显示区 \n");
printf("T1树\n");
if(!T1 )
printf("\n 当前为空树\n");
else{
PrintBSTree(T1,1);
}

printf("T2树\n");
if(!T2 )
printf("\n 当前为空树\n");
else
PrintBSTree(T2,1);
printf("\n******************************************************************************\n");
printf("T1操作:1.创建 2.插入 3.查找 4.删除 10.分裂\n");
printf("T2操作:5.创建 6.插入 7.查找 8.删除 11.分裂\n");
printf(" 9.合并T1,T2 0.退出\n");
printf("******************************************************************************\n");
printf("输入你要进行的操作:");
scanf("%d",&cho);
switch(cho){
case 1:
CreatBSTree(T1);
break;
case 2:
printf("请输入要插入关键字的值");
scanf("%d",&e);
InsertAVL(T1,e,taller) ;
break;
case 3:
printf("请输入要查找关键字的值");
scanf("%d",&e);

if(SearchBST(T1,e))
printf("查找成功!\n");
else
printf("查找失败!\n");
printf("按任意键返回87");
getchar();
getchar();
break;
case 4:
printf("请输入要删除关键字的值");
scanf("%d",&e);
if(DeleteAVL(T1,e,k))
printf("删除成功!\n");
else
printf("删除失败!\n");
printf("按任意键返回");
getchar();
getchar();
break;
case 5:
CreatBSTree(T2);
break;
case 6:
printf("请输入要插入关键字的值");
scanf("%d",&e);
InsertAVL(T2,e,taller) ;
break;
case 7:
printf("请输入要查找关键字的值");
scanf("%d",&e);

if(SearchBST(T2,e))
printf("查找成功!\n");
else
printf("查找失败!\n");
printf("按任意键返回");
getchar();
getchar();
break;
case 8:
printf("请输入要删除关键字的值");
scanf("%d",&e);
if(DeleteAVL(T2,e,k))
printf("删除成功!\n");
else
printf("删除失败!\n");
printf("按任意键返回");
getchar();
getchar();
break;
case 9:
merge(T1,T2);
T2 = NULL;
printf("合并成功,按任意键返回");
getchar();
getchar();
break;
case 10:
printf("请输入要中间值字的值");
scanf("%d",&e);
splitBSTree(T1,e,T1,T2) ;
printf("分裂成功,按任意键返回");
getchar();
getchar();
break;
case 11:
printf("请输入要中间值字的值");
scanf("%d",&e);
splitBSTree(T2,e,T1,T2) ;
printf("分裂成功,按任意键返回");
getchar();
getchar();
break;
case 0:
system("cls");
exit(0);
}

}

}

void main(){
BSTree T1 = NULL;
BSTree T2 = NULL;
Start(T1,T2);
}

最后附上一个运行图吧,创建后的一棵平衡二叉树

转载于:https://www.cnblogs.com/YESheng/p/3169637.html

数据结构课程设计--平衡二叉树相关推荐

  1. 数据结构课程设计——机票售卖系统(C++)

    引言 这学期最后的数据结构课程设计需要我们完成一个简单的小程序,我选择了一个机票售卖系统,实现了一些基本的功能:因为时间给的比较短,又赶在复习周补课,所以并没有什么突出的地方,我就在这里聊聊我的代码实 ...

  2. 数据结构课程设计---最长公共子串

    数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能: ①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中 ...

  3. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...

    (数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...

  4. c语言数据结构五子棋实验报告,数据结构课程设计-五子棋

    数据结构课程设计-五子棋 姓 名: 学 院: 计算机与通信学院 班 级: 通信工程 101 班 指导老师: 目录一.需求分析 31.1 开发背景 .32.2 功能简介 .3二.系统设计 42.1 函数 ...

  5. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

  6. c语言小数表达式运算课程设计,数据结构课程设计表达式计算.doc

    数据结构课程设计表达式计算 福建农林大学计算机与信息学院 计算机类 课程设计报告 课程名称:算法与数据结构课程设计题目:表达式计算姓 名:系:数学系专 业:数学与应用数学年 级:学 号:指导教师:宁正 ...

  7. 数据结构课程设计:顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现...

    原来做的数据结构课程设计,今天整理资料时偶然发现了,自己留着没啥意思,共享一下吧,互相交流学习 要求 设有一元多项式Am(x)和Bn(x). Am(x)=A0+A1x1+A2x2+A3x3+- +Am ...

  8. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...

    <数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...

  9. 学生搭配问题数据结构报告c语言,数据结构课程设计_学生搭配问题.doc

    数据结构课程设计_学生搭配问题 数据结构课程设计 题 目: 学生搭配问题 学 院: 班 级: 学 生 姓 名: 学 生 学 号: 指 导 教 师: 2012 年 12 月 3 日 课程设计任务书 姓名 ...

最新文章

  1. LeetCode455 分发饼干(二分法)
  2. 当亿级流量App开始“玩”,到底在玩什么?
  3. 李浩:无限节点的CDN架构演进
  4. centos7输入systemctl status network.service出现Unit network.service could not be found的解决办法
  5. Opencv3 形态学操作
  6. 数据库的主键和外键总结
  7. Excel表中的数据导入到数据库中
  8. 支持simnow模拟,特别适合炒单使用的CTP期货交易终端(看穿式)
  9. 某三甲医院大数据平台建设应用与实践
  10. ios识别人脸自动拍照_GitHub - qingweiiOS/FaceRecognition: 活体人脸识别,识别人脸,识别张嘴和摇头动作,并拍照...
  11. LeetCode程序员面试金典(第 6 版)中
  12. 【2017-01-09】 资料链接摘录
  13. 奇幻文学的鼻祖、善与恶的经典战争 《魔戒三部曲》[英]J.R.R.托尔金
  14. win10 查看计算机名称与用户名称
  15. APICloud数据云3.0使用教程
  16. 木舟总结 | 2021年推文笔记分类汇总
  17. idea evaluation license has expired 解决办法
  18. 白话Elasticsearch11-深度探秘搜索技术之基于tie_breaker参数优化dis_max搜索效果
  19. Apache Atlas 安装
  20. 华为管理学案例分析_华为管理课程

热门文章

  1. 分布问题(二元,多元变量分布,Beta,Dir)
  2. [HAOI2016]找相同字符
  3. day 029 缓冲区和粘包 day 30 粘包的解决
  4. 升级 python 2.6.6 到 2.7.14 版本(pip工具安装)
  5. 运维小白死磕的专业术语,你真的理解透了吗?
  6. 通信网络安全还应从基础设施保护做起
  7. DAM的内涵正在改变
  8. 一个华为设备防病毒 ACL 配置
  9. 数据结构与算法笔记(一) 程序性能分析
  10. mysql的未提示输入密码