//* * * * * * * * * * * * * * * * * * * * * * * *
//*CHAPTER :6 (6_5) *
//*PROGRAM :平衡二叉排序树的综合操作 *
//*CONTENT :Insert,Search *
//* * * * * * * * * * * * * * * * * * * * * * * *
#include <dos.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define LH 1 //左子树高
#define EH 0 //左右子树等高
#define RH -1 //右子树高
enum BOOL{False,True};
typedef struct //定义记录的结构
{int keynum; //在本程序中只含有关键字一项
}Record;
typedef struct BSTNode //定义平衡二叉树节点结构
{Record data; //数据域
int bf; //平衡因子
struct BSTNode *lchild,*rchild; //左右孩子指针域
}BSTNode,*BSTree;
BSTree SearchBST(BSTree,int); //在平衡二叉排序树中查找元素
BOOL InsertAVL(BSTree &,Record,BOOL&); //在平衡二叉排序树中插入元素
void LeftBalance(BSTree &); //左平衡旋转处理
void RightBalance(BSTree &); //右平衡旋转处理
void InorderBST(BSTree); //中序遍历二叉排序树,即从小到大显示各元素
void R_Rotate(BSTree &); //右旋处理
void L_Rotate(BSTree &); //左旋处理
void main()
{BSTree T,p;
Record R;
char ch,keyword,j='y';
BOOL temp,taller;
textbackground(3); //设定屏幕颜色
textcolor(15);
clrscr();
//-------------------------程序说明-------------------------------
printf("This program will show how to operate to \na Balanced Binary Sort Tree.\n");
printf("You can display all elems,search a elem,insert a elem.\n");
//----------------------------------------------------------------
T=NULL;
while(j!='n')
{printf("1.display\n");
printf("2.search\n");
printf("3.insert\n");
printf("4.exit\n");
scanf(" %c",&ch); //输入操作选项
switch(ch)
{case '1':if(!T) printf("The BST has no elem.\n"); //此时平衡二叉排序树空
else {InorderBST(T);printf("\n");} //中序遍历二叉树,即从小到大显示所有元素
break;
case '2':printf("Input the keynumber of elem to be searched(int number):");
scanf("%d",&R.keynum); //输入要查找元素的关键字
p=SearchBST(T,R.keynum);
//p=NULL:查找不成功;p!=NULL:查找成功,p指向该记录
if(!p) printf("The record isn't existed!\n"); //没有找到
else printf("The record has been found!\n"); //成功找到
break;
case '3':printf("Input the record to be inserted(int number):");
scanf("%d",&R.keynum); //输入要插入元素的关键字
temp=InsertAVL(T,R,taller);
//temp=True:成功插入该记录;temp=False:树中已有与记录R有相同关键字的记录
if(!temp) printf("The record has been existed!\n"); //该元素已经存在
else printf("Sucess to insert!\n"); //成功插入
break;
default: j='n';
}
}
printf("The program is over!\nPress any key to shut off the window!\n");
getchar();getchar();
}
void InorderBST(BSTree T)
{//以中序方式遍历二叉排序树T,即从小到大显示二叉排序树的所有元素
if(T->lchild) InorderBST(T->lchild);
printf("%-4d",T->data.keynum);
if(T->rchild) InorderBST(T->rchild);
}
BSTree SearchBST(BSTree T,int key)
{//在根指针T所指二叉排序树中递归的查找其关键字等于key的元素,若查找成功
//则返回该元素的地址,若查找不成功,返回地址为NULL
if((!T)||key==T->data.keynum) return (T);
else if(key<T->data.keynum) return(SearchBST(T->lchild,key));
else return(SearchBST(T->rchild,key));
}
BOOL InsertAVL(BSTree &T,Record e,BOOL &taller)
{//若在平衡二叉排序树T中中不存在和e有相同关键字的结点,则插入一个数据元素
//为e的新结点,并返回True,否则返回False。若因插入而使平衡二叉排序树失去
//平衡,则做平衡旋转处理,布尔变量taller反映T长高与否
if(!T) //插入新结点,树“长高”,置taller为True
{T=(BSTree)malloc(sizeof(BSTNode));
T->data=e;
T->lchild=T->rchild=NULL;
T->bf=EH;
taller=True;
}
else
{if(e.keynum==T->data.keynum) //树中已有与e有相同关键字的结点
{taller=False; return False;} //不再插入
if(e.keynum<T->data.keynum) //应继续在*T的左子树中进行搜索
{if(!InsertAVL(T->lchild,e,taller)) return False; //未插入
if(taller) //已插入到*T的左子树中且左子树“长高”
switch(T->bf) //检查*T的平衡度
{case LH:LeftBalance(T); //原本左子树比右子树高,需要做左平衡处理
taller=False;
break;
case EH:T->bf=LH; //原本左右子树等高,现因左子树增高而使树增高
taller=True;
break;
case RH:T->bf=EH; //原本右子树比左子树高,现左右子树等高
taller=False;
break;
}
}
else //应继续在*T的右子树中进行搜索
{if(!InsertAVL(T->rchild,e,taller)) return False;//未插入
if(taller) //已插入到*T的右子树中且右子树“长高”
switch(T->bf) //检查*T的平衡度
{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 LeftBalance(BSTree &T)
{//对以指针T所指结点为根的二叉树做左平衡旋转处理,本算法结束时,
//指针T指向新的根结点
BSTree lc,rd;
lc=T->lchild; //lc指向*T的左子树根结点
switch(lc->bf) //检查*T的左子树的平衡度,并作相应平衡处理
{case LH:T->bf=lc->bf=EH; //新结点插入在*T的左孩子的左子树上,要作单右旋处理
R_Rotate(T);
break;
case RH: //新结点插入在*T的左孩子的右子树上,要作双旋处理
rd=lc->rchild; //rd指向*T的左孩子的右子树根
switch(rd->bf) //修改*T及其左孩子的平衡因子
{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); //对*T的左子树作左旋平衡处理�
R_Rotate(T); //对*T作右旋平衡处理
}
}
void RightBalance(BSTree &T)
{//对以指针T所指结点为根的二叉树做右平衡旋转处理,本算法结束时,
//指针T指向新的根结点
BSTree rc,ld;
rc=T->rchild; //rc指向*T的右子树根结点
switch(rc->bf) //检查*T的右子树的平衡度,并作相应平衡处理
{case LH: //新结点插入在*T的右孩子的左子树上,要作双旋处理
ld=rc->lchild; //ld指向*T的右孩子的左子树根
switch(ld->bf) //修改*T及其右孩子的平衡因子
{case LH:T->bf=EH;rc->bf=RH;break;
case EH:T->bf=rc->bf=EH;break;
case RH:T->bf=LH;rc->bf=EH;break;
}
ld->bf=EH;
R_Rotate(T->rchild); //对*T的右子树作右旋平衡处理�
L_Rotate(T); //对*T作左旋平衡处理
break;
case RH:T->bf=rc->bf=EH; //新结点插入在*T的右孩子的右子树上,要作单左旋处理
L_Rotate(T);
}
}
void L_Rotate(BSTree &p)
{//对以*p为根的二叉排序树作左旋处理,处理之后p指向新的根结点,即旋转处理
//之前的右子树的根结点
BSTree rc;
rc=p->rchild; //rc指向p右子树根结点
p->rchild=rc->lchild; //rc的左子树挂接为p的右子树
rc->lchild=p; //p指向新的根结点
p=rc;
}
void R_Rotate(BSTree &p)
{//对以*p为根的二叉排序树作右旋处理,处理之后p指向新的根结点,即旋转处理
//之前的左子树的根结点
BSTree lc;
lc=p->lchild; //lc指向p左子树根结点
p->lchild=lc->rchild; //lc的右子树挂接为p的左子树
lc->rchild=p; //p指向新的根结点
p=lc;
}
没有合适的资源?快使用搜索试试~ 我知道了~
经典数据结构算法c++源码
共129个文件
exe:63个
cpp:62个
mfm1992:2个
需积分: 0 27 下载量 136 浏览量
2008-11-29
11:03:00
上传
评论
收藏 823KB RAR 举报
温馨提示
主要是讲述数据结构书本中的各种算法的C++实现方式。
资源详情
资源评论
资源推荐
收起资源包目录
经典数据结构算法c++源码 (129个子文件)
平衡二叉排序树的综合操作.CPP 7KB
平衡二叉排序树的综合操作.CPP 7KB
关键路径.CPP 6KB
关键路径.CPP 6KB
链式结构的线性表.CPP 5KB
链式结构的线性表.CPP 5KB
图的遍历.CPP 5KB
图的遍历.CPP 5KB
哈希表的综合操作.CPP 5KB
哈希表的综合操作.CPP 5KB
非递归遍历二叉树.CPP 5KB
非递归遍历二叉树.CPP 5KB
二叉排序树的综合操作.CPP 5KB
二叉排序树的综合操作.CPP 5KB
哈夫曼树.CPP 4KB
哈夫曼树.CPP 4KB
拓扑排序.CPP 4KB
拓扑排序.CPP 4KB
双向链表.CPP 4KB
双向链表.CPP 4KB
最短路径1.CPP 4KB
最短路径1.CPP 4KB
最短路径2.CPP 4KB
最短路径2.CPP 4KB
顺序结构的线性表.CPP 4KB
顺序结构的线性表.CPP 4KB
线索二叉树.CPP 4KB
线索二叉树.CPP 4KB
静态树表的查找.CPP 4KB
静态树表的查找.CPP 4KB
表达式求值.CPP 3KB
表达式求值.CPP 3KB
最小代价生成树.CPP 3KB
最小代价生成树.CPP 3KB
链式队列.CPP 3KB
链式队列.CPP 3KB
堆栈操作.CPP 3KB
堆栈操作.CPP 3KB
二叉树.CPP 3KB
二叉树.CPP 3KB
快速排序.CPP 3KB
快速排序.CPP 3KB
链式堆栈.CPP 3KB
链式堆栈.CPP 3KB
循环队列.CPP 3KB
循环队列.CPP 3KB
归并排序.CPP 3KB
归并排序.CPP 3KB
希尔排序.CPP 3KB
希尔排序.CPP 3KB
堆排序.CPP 3KB
堆排序.CPP 3KB
二分查找.CPP 3KB
二分查找.CPP 3KB
顺序查找.CPP 2KB
顺序查找.CPP 2KB
简单选择排序.CPP 2KB
简单选择排序.CPP 2KB
起泡排序.CPP 2KB
起泡排序.CPP 2KB
直接插入排序.CPP 2KB
直接插入排序.CPP 2KB
表达式求值.EXE 31KB
表达式求值.EXE 31KB
非递归遍历二叉树.EXE 18KB
非递归遍历二叉树.EXE 18KB
链式结构的线性表.EXE 18KB
链式结构的线性表.EXE 18KB
关键路径.EXE 18KB
关键路径.EXE 18KB
最短路径2.EXE 18KB
最短路径2.EXE 18KB
图的遍历.EXE 17KB
图的遍历.EXE 17KB
平衡二叉排序树的综合操作.EXE 17KB
平衡二叉排序树的综合操作.EXE 17KB
哈希表的综合操作.EXE 17KB
哈希表的综合操作.EXE 17KB
顺序结构的线性表.EXE 17KB
顺序结构的线性表.EXE 17KB
双向链表.EXE 17KB
双向链表.EXE 17KB
二叉排序树的综合操作.EXE 17KB
二叉排序树的综合操作.EXE 17KB
哈夫曼树.EXE 17KB
哈夫曼树.EXE 17KB
二叉树.EXE 17KB
二叉树.EXE 17KB
最短路径1.EXE 17KB
最短路径1.EXE 17KB
静态树表的查找.EXE 17KB
静态树表的查找.EXE 17KB
堆栈操作.EXE 17KB
堆栈操作.EXE 17KB
拓扑排序.EXE 17KB
拓扑排序.EXE 17KB
链式队列.EXE 16KB
链式队列.EXE 16KB
链式堆栈.EXE 16KB
链式堆栈.EXE 16KB
共 129 条
- 1
- 2
追求
- 粉丝: 24
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- sensors-18-03721.pdf
- Facebook.apk
- 推荐一款JTools的call-this-method插件
- json的合法基色来自红包东i请各位
- 项目采用YOLO V4算法模型进行目标检测,使用Deep SORT目标跟踪算法 .zip
- 针对实时视频流和静态图像实现的对象检测和跟踪算法 .zip
- 部署 yolox 算法使用 deepstream.zip
- 基于webmagic、springboot和mybatis的MagicToe Java爬虫设计源码
- 通过实时流协议 (RTSP) 使用 Yolo、OpenCV 和 Python 进行深度学习的对象检测.zip
- 基于Python和HTML的tb商品列表查询分析设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0