题目

编程实现二叉平衡树的创建、插入、删除和查询
对于给定的这组数二叉平衡树上进行查找,给出两种情况下的查找成功和不成功时的ASL

代码

#include <bits/stdc++.h>
using namespace std;
typedef int status;
#define true 1
#define false 0
#define LH +1 //左高
#define EH 0  //等高
#define RH -1 //右高
const int MAXN=1e4+10;
typedef struct Bitnode
{int data;int bf; //储存结点的平衡因子struct Bitnode *left, *right;
} Bitnode, *Bitree;
//操作
void R_rotate(Bitree *p);
void L_rotate(Bitree *p);
void Leftbalance(Bitree *T);
void Rightbalance(Bitree *T);
status Insertavl(Bitree *T, int e, status *taller);
void Createavl(Bitree *T, int a[], int n);
void Showbst(Bitree T); //中序遍历输出二叉树
//f指向T的双亲,当T指向根节点时,因此f的初始调用值为Null
//查找成功,指针p指向该数据元素的结点,返回TRUE
//查找失败,P指向查找路径上访问的最后一个元素,返回false
int cnt;
Bitree Searchavl(Bitree T, int key)
{if (!T)return NULL;//搜索到if (key == T->data)return T;else if (key < T->data){//在左子树中搜索return Searchavl(T->left, key);}else{//在右子树中搜索return Searchavl(T->right, key);}
}
//对以p为根的二叉排序树做右旋处理。处理之后p指向新的树根节点
//即旋转之前的左子树的根节点
void R_rotate(Bitree *p)
{Bitree L;L = (*p)->left;(*p)->left = L->right;L->right = *p;*p = L;
}
//对以p为根的二叉排序树做左旋处理。处理之后p指向新的树根节点
//即旋转之前的左子树的根节点
void L_rotate(Bitree *p)
{Bitree R;R = (*p)->right;(*p)->right = R->left;R->left = *p;*p = R;
}
//对以T为根的二叉排序树做左旋平衡处理
//处理之后T指向新的树根节点
void Leftbalance(Bitree *T)
{Bitree L, Lr;L = (*T)->left; //L指向T的左子树根结点switch (L->bf){//检查T左子树的平衡度,并做相应的处理case LH: //新节点插入在T的左孩子的左子树上,要做单右旋处理(*T)->bf = L->bf = EH;R_rotate(T);break;case RH:           //新节点插入在T的左孩子的右子树上,要做单右旋处理Lr = L->right; //Lr指向T的左孩子的右子树根switch (Lr->bf){case LH:(*T)->bf = RH;L->bf = EH;break;case EH:(*T)->bf = L->bf = RH;break;case RH:(*T)->bf = EH;L->bf = LH;break;}Lr->bf = EH;L_rotate(&(*T)->left);R_rotate(T);}
}
//T 的右边高,不平衡,使其平衡,左旋转,左旋转前先检查R->bf
//如果为LH,R要先进行右旋转,使T->rchild->bf和T->bf一致
void Rightbalance(Bitree *T)
{Bitree R, Rl;R = (*T)->right;Rl = R->left;switch (R->bf){case RH:R->bf = (*T)->bf = EH;L_rotate(T);break;case LH:switch (R->bf){case LH:R->bf = RH;(*T)->bf = EH;break;case EH:R->bf = (*T)->bf = EH;break;case RH:R->bf = EH;(*T)->bf = LH;break;}Rl->bf = EH;R_rotate(&R);L_rotate(T);break;}
}
//若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个
//数据元素为e的新节点并返回1,否则返回0
//若因插入使得二叉树失去平衡,则做平衡旋转,布尔变量taller反映T长高与否
status Insertavl(Bitree *T, int e, status *taller)
{if (!*T){//插入新节点,树长高,taller为true*T = (Bitree)malloc(sizeof(Bitnode));(*T)->data = e;(*T)->left = (*T)->right = NULL;(*T)->bf = EH;*taller = true;}else{if (e == (*T)->data){//树中存在和e有相同关键字的结点将不再插入*taller = false;return false;}if (e < (*T)->data){//应继续在t的左子树中进行搜索if (!Insertavl(&(*T)->left, e, taller))return false;if (*taller){switch ((*T)->bf){case LH:Leftbalance(T);*taller = false;break;case EH:(*T)->bf = LH;*taller = true;break;case RH:(*T)->bf = EH;*taller = false;break;}}}else{if (!Insertavl(&(*T)->right, e, taller))return false;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 true;
}
void Createavl(Bitree *T, int a[], int n)
{int i;status taller;for (i = 0; i < n; i++){Insertavl(T, a[i], &taller);}
}
void Showbst(Bitree T)
{if (T){Showbst(T->left);cout << T->data << " ";Showbst(T->right);}
}
bool bfs(Bitree &T,int key)
{Bitree vis[MAXN];int fron = 1, rear = 1;vis[rear] = T;cout<<T->data<<endl;int cnt=0;while (fron <= rear){Bitree p = vis[fron++];if(p->data == key) return 1;if (p->left != NULL) vis[++rear] = p->left,cout<<"****"<<endl;if (p->right != NULL) vis[++rear] = p->right,cout<<"****"<<endl;}return 0;
}
int num=0;
int number(Bitree &T)
{if(T){num++;number(T->left);number(T->right);}return num;
}
double ASL(Bitree &T,int key)
{if(bfs(T,key)==1) //能成功查找{int num=number(T); //得到树中节点的数量int d[MAXN];memset(d,-1,sizeof(d));Bitree vis[MAXN];int fron = 1, rear = 1;vis[rear] = T;d[T->data]=1;int res=1;while (fron <= rear){Bitree p = vis[fron++];if (p->left != NULL){vis[++rear] = p->left;d[p->left->data]=d[p->data]+1;res=res+d[p->left->data];}if (p->right!= NULL){vis[++rear] = p->right;d[p->right->data]=d[p->data]+1;res=res+d[p->right->data];}}return (res*1.0)/(num*1.0);}else //不能成功查找{int num=0;int d[MAXN];memset(d,-1,sizeof(d));Bitree vis[MAXN];int fron = 1, rear = 1;vis[rear] = T;d[T->data]=1;int res=0;while (fron <= rear){Bitree p = vis[fron++];if (p->left != NULL){vis[++rear] = p->left;d[p->left->data]=d[p->data]+1;}if (p->right != NULL){vis[++rear] = p->right;d[p->right->data]=d[p->data]+1;}if( (p->left == NULL && p->right != NULL) || (p->left != NULL && p->right == NULL) ){num++;res=res+d[p->data];}if(p->left == NULL && p->right == NULL){num=num+2;res=res+d[p->data]+d[p->data];}}return (res*1.0)/(num*1.0);}
}
int main()
{int a[] = {62, 88, 58, 47, 35, 73, 51, 99, 37, 93};Bitree T = NULL;status taller = 0;//创建二叉排序树Createavl(&T, a, 10);cout << "中序遍历的结果为:" << endl;Showbst(T);cout << endl;//在二叉排序树中插入56Insertavl(&T, 56, &taller);cout << "中序遍历的结果为:" << endl;Showbst(T);cout << endl;int b = 58; //需要查找的值Bitree p = NULL;Bitree T0 = Searchavl(T, b);cout << "查找结果为:\n"<< "指针:" << T0 << endl<< "指针的值为:" << T0->data << endl;//输出查找的ASLint key;cout<<"Please enter a band to find the element : ";cin>>key;cout<<ASL(T,key)<<endl;system("pause");return 0;
}

数据结构课设——ASL平衡二叉排序树相关推荐

  1. 那些年,我的数据结构课设,现在满满的回忆!(现如今身处内卷之中,已经很难出现当初那份乐趣了)

    一.看到这个图标很有感觉 距离当初完成数据结构课设已经过去很久很久了,当初由于U盘失踪,也丢失了很多宝贵的东西,我也伤心的好久`(>﹏<)′!不过最近找到了失散多年的亲兄弟,打开U盘,感概 ...

  2. 南京航空航天大学2020数据结构课设

    南京航空航天大学2020数据结构课设 目录 1.系统进程设计 2.迷宫问题 3.家谱管理系统 4.Huffman编码与解码 5.地铁修建 6.公交线路提示 7.B-树应用 8.排序算法比较 9.数字排 ...

  3. 学生搭配问题数据结构报告c语言,数据结构课设学生搭配问题

    数据结构课设学生搭配问题 数 据 结 构 课程设计报告书 班级 学号 专业 姓名 课题描述: 一. 需求分析: 1. 设计内容 一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编 ...

  4. 数据结构课设_网页形式的景区导游

    一.前言 欢迎大家来到这里~~ 1.这次数据结构课设,笔者的题目是网页形式的导航系统. 2.数据结构方面应用了链表存储商品信息.图来存储景点和路径信息.在图的广度优先中还用到了队列: 3.具体的算法有 ...

  5. 神秘国度的爱情故事 数据结构课设-广州大学

    神秘国度的爱情故事 数据结构课设-广州大学 ps:本次课设程序不仅需要解决问题,更需要注重代码和算法的优化和数据测试分析      直接广度优先实现的方法时间复杂度为O(QN),优化后的方法是lca+ ...

  6. 模拟浏览器操作程序(数据结构课设)

    文章目录 前言 一.题目 二.系统设计 2.1 功能模块图 2.2 主要功能函数 三.问题分析 四.实验结果及分析 五.源码 总结 前言 20级cqut的别抄! 一.题目  模拟浏览器操作程序:标准的 ...

  7. 背包问题求解(数据结构课设)

    文章目录 前言 一.题目 二.功能模块图 三.问题分析 四.实验结果及分析 五.源码 总结 前言 20级cqut的别抄! 一.题目  背包问题的求解:假设有一个能装入总体积为T的背包和n件体积分别为w ...

  8. 华南农业大学课设——数据结构课设、Java课设、操作系统课设

    文章目录 缘起 大二上-数据结构课设(高校教学管理系统)-C++.Qt 视频演示 感想 大二下-Java课设(流程图绘制程序)-JavaFX 视频演示 感想 大三上-操作系统课设(模拟磁盘文件系统实现 ...

  9. 数据结构课设——汉诺塔游戏演示

    源代码下载地址:数据结构课设--汉诺塔游戏演示 一. 问题描述 汉诺塔游戏问题中的数据元素具有如下形式: lchild:左孩子结点 rchild:右孩子结点 num:该移动步骤需要移动的盘子的编号 s ...

最新文章

  1. Dvtm -- 平铺式终端
  2. java 数组的索引值_按索引访问Java数组位置的值
  3. 301重定向怎么进行URL标准化设置?
  4. Macaca基础原理解析
  5. RocketMQ源码解析-Producer启动
  6. win2012iis php,Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  7. 方法 -------JavaScript
  8. win7桌面图标计算机打不开,win7系统下双击电脑桌面图标打不开的解决方法
  9. Target runtime com.genuitec.runtime.generic.jee60 is not defined
  10. 关于使用阿里云centos7如何搭建L2TP用于学习2021年7月亲测
  11. 2022腾讯云学生云服务器申请攻略(25岁以下免学生认证)
  12. vcard微信电子名片
  13. LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页
  14. echarts xAxis字显示不全
  15. 自动驾驶数据闭环系列之一:理想丰满,现实骨感
  16. NLP文档挖宝(1)——tokenizer的诞生
  17. python主函数调用格式_Python的模块与函数
  18. Typora基础用法:pandoc安装,导入导出word文档,pdf文件。设置图片目录
  19. 在Python中使用Elasticsearch
  20. 脑电图(EEG)与脑电导分布10-20系统

热门文章

  1. 嵌入式LinuxAndroid开发-I2C外设驱动
  2. Jenkins基础入门-8-构建触发器之远程构建
  3. www.wljx.net/forum.php,齐博CMS:主页被黑,不知漏洞在哪?
  4. js判断两字符串是否相等不区分大小写
  5. 联想拯救者y7000键盘有几个按键失灵_联想 拯救者Y7000P 键盘失灵怎么办?
  6. 工作分析文献综述_文献综述的写作步骤和注意事项
  7. display:flex垂直居中
  8. 【2020牛客面经整理】美团一面
  9. 微信小程序console打印json数据
  10. 5e怎么绑定一键跳投_企业邮箱如何绑定微信?微信怎么添加邮箱?