用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

数据结构平衡二叉树

参考代码如下:

/*

名称:平衡二叉树

语言:数据结构C语言版

编译环境:VC++ 6.0

日期: 2014-3-26

*/

#include

#include

#include

#define LH +1 // 左高

#define EH 0 // 等高

#define RH -1 // 右高

#define N 5 // 数据元素个数

typedef char KeyType; // 设关键字域为字符型

typedef struct

{

KeyType key;

int order;

}ElemType; // 数据元素类型

// 平衡二叉树的类型

typedef struct BSTNode

{

ElemType data;

// bf结点的平衡因子,只能够取0,-1,1,它是左子树的深度减去

// 右子树的深度得到的

int bf;

struct BSTNode *lchild,*rchild; // 左、右孩子指针

}BSTNode,*BSTree;

// 构造一个空的动态查找表DT

int InitDSTable(BSTree *DT)

{

*DT=NULL;

return 1;

}

// 销毁动态查找表DT

void DestroyDSTable(BSTree *DT)

{

if(*DT) // 非空树

{

if((*DT)->lchild) // 有左孩子

DestroyDSTable(&(*DT)->lchild); // 销毁左孩子子树

if((*DT)->rchild) // 有右孩子

DestroyDSTable(&(*DT)->rchild); // 销毁右孩子子树

free(*DT); // 释放根结点

*DT=NULL; // 空指针赋0

}

}

// 在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素,

// 若查找成功,则返回指向该数据元素结点的指针,否则返回空指针。

BSTree SearchBST(BSTree T,KeyType key)

{

if((!T)|| (key == T->data.key))

return T; // 查找结束

else if(key < T->data.key) // 在左子树中继续查找

return SearchBST(T->lchild,key);

else

return SearchBST(T->rchild,key); // 在右子树中继续查找

}

// 对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,即旋转

// 处理之前的左子树的根结点。

void R_Rotate(BSTree *p)

{

BSTree lc;

lc=(*p)->lchild; // lc指向p的左子树根结点

(*p)->lchild=lc->rchild; // lc的右子树挂接为p的左子树

lc->rchild=*p;

*p=lc; // p指向新的根结点

}

// 对以*p为根的二叉排序树作左旋处理,处理之后p指向新的树根结点,即旋转

// 处理之前的右子树的根结点。

void L_Rotate(BSTree *p)

{

BSTree rc;

rc=(*p)->rchild; // rc指向p的右子树根结点

(*p)->rchild=rc->lchild; // rc的左子树挂接为p的右子树

rc->lchild=*p;

*p=rc; // p指向新的根结点

}

// 对以指针T所指结点为根的二叉树作左平衡旋转处理,本算法结束时,

// 指针T指向新的根结点。

void LeftBalance(BSTree *T)

{

BSTree lc,rd;

lc=(*T)->lchild; // lc指向*T的左子树根结点

switch(lc->bf)

{ // 检查*T的左子树的平衡度,并作相应平衡处理

case LH: // 新结点插入在*T的左孩子的左子树上,要作单右旋处理

(*T)->bf=lc->bf=EH;

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;

}

rd->bf=EH;

L_Rotate(&(*T)->lchild); // 对*T的左子树作左旋平衡处理

R_Rotate(T); // 对*T作右旋平衡处理

}

}

// 对以指针T所指结点为根的二叉树作右平衡旋转处理,本算法结束时,

// 指针T指向新的根结点

void RightBalance(BSTree *T)

{

BSTree rc,rd;

rc=(*T)->rchild; // rc指向*T的右子树根结点

switch(rc->bf)

{ // 检查*T的右子树的平衡度,并作相应平衡处理

case RH: // 新结点插入在*T的右孩子的右子树上,要作单左旋处理

(*T)->bf=rc->bf=EH;

L_Rotate(T);

break;

case LH: // 新结点插入在*T的右孩子的左子树上,要作双旋处理

rd=rc->lchild; // rd指向*T的右孩子的左子树根

switch(rd->bf)

{ // 修改*T及其右孩子的平衡因子

case RH: (*T)->bf=LH;

rc->bf=EH;

break;

case EH: (*T)->bf=rc->bf=EH;

break;

case LH: (*T)->bf=EH;

rc->bf=RH;

}

rd->bf=EH;

R_Rotate(&(*T)->rchild); // 对*T的右子树作右旋平衡处理

L_Rotate(T); // 对*T作左旋平衡处理

}

}

// 若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个

// 数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树

// 失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。

int InsertAVL(BSTree *T,ElemType e,int *taller)

{

if(!*T)

{ // 插入新结点,树“长高”,置taller为1

*T=(BSTree)malloc(sizeof(BSTNode));

(*T)->data=e;

(*T)->lchild=(*T)->rchild=NULL;

(*T)->bf=EH;

*taller=1;

}

else

{

if(e.key == (*T)->data.key)

{ // 树中已存在和e有相同关键字的结点则不再插入

*taller=0;

return 0;

}

if(e.key < (*T)->data.key)

{ // 应继续在*T的左子树中进行搜索

if(!InsertAVL(&(*T)->lchild,e,taller)) // 未插入

return 0;

if(*taller)

// 已插入到*T的左子树中且左子树“长高”

switch((*T)->bf) // 检查*T的平衡度

{

case LH:

// 原本左子树比右子树高,需要作左平衡处理

LeftBalance(T);

*taller=0; //标志没长高

break;

case EH:

// 原本左、右子树等高,现因左子树增高而使树增高

(*T)->bf=LH;

*taller=1; //标志长高

break;

case RH:

// 原本右子树比左子树高,现左、右子树等高

(*T)->bf=EH;

*taller=0; //标志没长高

}

}

else

{

// 应继续在*T的右子树中进行搜索

if(!InsertAVL(&(*T)->rchild,e,taller)) // 未插入

return 0;

if(*taller) // 已插入到T的右子树且右子树“长高”

switch((*T)->bf) // 检查T的平衡度

{

case LH:

(*T)->bf=EH; // 原本左子树比右子树高,现左、右子树等高

*taller=0;

break;

case EH: // 原本左、右子树等高,现因右子树增高而使树增高

(*T)->bf=RH;

*taller=1;

break;

case RH: // 原本右子树比左子树高,需要作右平衡处理

RightBalance(T);

*taller=0;

}

}

}

return 1;

}

// 按关键字的顺序对DT的每个结点调用函数Visit()一次

void TraverseDSTable(BSTree DT,void(*Visit)(ElemType))

{

if(DT)

{

TraverseDSTable(DT->lchild,Visit); // 先中序遍历左子树

Visit(DT->data); // 再访问根结点

TraverseDSTable(DT->rchild,Visit); // 最后中序遍历右子树

}

}

void print(ElemType c)

{

printf("(%d,%d)",c.key,c.order);

}

int main()

{

BSTree dt,p;

int k;

int i;

KeyType j;

ElemType r[N]={

{13,1},{24,2},{37,3},{90,4},{53,5}

}; // (以教科书P234图9.12为例)

InitDSTable(&dt); // 初始化空树

for(i=0;i

InsertAVL(&dt,r[i],&k); // 建平衡二叉树

TraverseDSTable(dt,print); // 按关键字顺序遍历二叉树

printf("\n请输入待查找的关键字: ");

scanf("%d",&j);

p=SearchBST(dt,j); // 查找给定关键字的记录

if(p)

print(p->data);

else

printf("表中不存在此值");

printf("\n");

DestroyDSTable(&dt);

system("pause");

return 0;

}

/*

输出效果:

(13,1)(24,2)(37,3)(53,5)(90,4)

请输入待查找的关键字: 53

(53,5)

请按任意键继续. . .

*/

运行结果如下:

a1b7a07c65167f260170397a754edcc6.gif

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运营商的互联网蜕变,从沃云平台开始

提起中国联通&#xff0c;许多人都在用它的网络。不可否认&#xff0c;从3G时代开始&#xff0c;中国联通就迎来了新一轮的增长&#xff0c;特别是在与网通合并之后&#xff0c;中国联通在北方区的移动和固网优势相比之前也更加明显。当然&#xff0c;除了运营商的属性之外&…

Python 列表List - Python零基础入门教程

目录 一.Python 列表 List 简介二.Python 列表 List 增加数据三.Python 列表 List 删除数据四.Python 列表 List 修改数据五.Python 列表 List 查找数据六.Python 列表 List 截取七.Python 列表 List 排序八.Python 列表 List 与字符串 str 的相互转换 1.str 字符串转列表 lis…

Cloud一分钟 | 云厂商Zoho域名被禁两小时;京东云公布医疗健康战略

Hello&#xff0c;everyone&#xff1a;9月26日早&#xff0c;星期三&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完01微 信 群 添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群公司职位”即可&#xff0c;加入【云计算学习交流群】&…

Python 元组tuple - Python零基础入门教程

目录 一.Python 元组 tuple 简介二.Python 元组 tuple 定义三.Python 元组 tuple 数据查询四.Python 元组 tuple 不支持删除/修改数据五.Python 元组 tuple 与 列表 list 相互转换六.重点总结七.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入…

如果有这样一台服务器……

作者孙浩峰原创作品&#xff0c;如有转载&#xff0c;请联系公众号授权。①2015年1月计算机科学家SebastianThrun博士对使用机器学习帮助医学诊断产生兴趣2015年6月Thrun博士的团队测试机器从教材图像的学习成果在大约14,000张图像中&#xff0c;系统得到了72%的正确率Thrun博士…

Python 条件推导式 - Python零基础入门教程

目录 一.Python 条件推导式简介二.Python 条件推导式使用 1.Python 条件推导式语法2.Python 条件推导式练习 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 截止到目前为止&#xff0c;Python 基础内容已经学习了 50% 左右&#xff0c;…

pt100温度传感器c语言,pt100测温程序-LCD1602

原标题&#xff1a;pt100测温程序-LCD1602#include"at89X52.h"sbit LCD_RS P2^0;sbit LCD_RW P2^1;sbit LCD_E P2^2;sbit ADC_CS P2^3;sbit ADC_WR P3^6;sbit ADC_RD P3^7;#define LCD_DATA P0unsigned char LcdBuf1[10]"";unsigned char code Bmp001[][8]…

Cloud一分钟 | CDN技术服务能力跻身一流,京东云与奇虎360联袂上演云上“京奇”...

Hello&#xff0c;everyone&#xff1a;9月27日早&#xff0c;星期四&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完01微 信 群 添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群公司职位”即可&#xff0c;加入【云计算学习交流群】&…

Python 列表推导式 - Python零基础入门教程

目录 一.Python 列表推导式简介二.Python 列表推导式语法三.Python 列表推导式练习 1.Python 列表推导式案例一2.Python 列表推导式案例二3.Python 列表推导式和循环效率对比 四.重点总结五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 …

android 主流分辨率是多少,android 屏幕分辨率问题

iPhone的icon设计就这么简单&#xff0c;iPhone的屏幕只有320480像素&#xff0c;所以程序没有适配性问题。Android在研究Android的icon设计之前&#xff0c;有必要先了解Android的界面是如何适配多样化屏幕的。适配性由于同一个UI元素(如100100像素的图片)在高精度的屏幕上要比…

肥宅有理?大数据帮你找到不去健身房的原(jie)因(kou)

作者宋宇 赵玮雯来源DT财经原创作品&#xff0c;如有转载&#xff0c;请联系公众号授权。扪心自问&#xff0c;是什么拖住了你奔往健身房的腿&#xff1f;数据给出的理由能让你心服口吗&#xff1f;A4腰、马甲线&#xff0c;让你成功反手摸肚脐……这些词已经不火了&#xff0c…

多亏它,让大家做好“山竹”来袭的准备【Make It Real故事汇】

不得不说台风“山竹”来得快去得也快周日广东多个城市还在接受狂风暴雨的洗礼周一上班族就开启了通勤路上的“披荆斩棘”天气情况的变化自古就影响着民生大计在古代&#xff0c;人们常依据风向、动物异象等预测台风&#xff0c;比如“东风转北&#xff0c;搓绳缚屋”&#xff0…

华为matepad 鸿蒙,曝华为4月27日召开高端平板发布会:MatePad Pro2将亮相 首发鸿蒙系统...

去年五月份&#xff0c;华为推出了Mate系列首款平板电脑——华为MatePad Pro&#xff0c;该机搭载了业内顶级的硬件配置&#xff0c;配合华为专门针对大屏设计适配的系统&#xff0c;带来了非常优秀的使用体验&#xff0c;饱受消费者好评。现在&#xff0c;华为新一代高端平板产…

Python 字典推导式 - Python零基础入门教程

目录 一.Python 字典推导式简介二.Python 字典推导式语法三.Python 字典推导式实战 1.在字典中提取或者修改数据&#xff0c;返回新的字典2.在字符串中提取数据&#xff0c;返回新的字典 四.重点总结五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho…

Cloud一分钟 | 阿里云发布飞天2.0操作系统;京东云串联生态伙伴专治“看病难”...

Hello&#xff0c;everyone&#xff1a;9月28日早&#xff0c;星期五&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完01微 信 群 添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群公司职位”即可&#xff0c;加入【云计算学习交流群】&…

Python 不定长参数 *argc/**kargcs - Python零基础入门教程

目录 一.前言二.Python 不定长参数 argc/*kargcs 简介 1.函数不定长参数 *args 使用2.函数不定长参数 **kwargs 使用3.函数不定长参数*args 和**kwargs 只能放在形参的末尾&#xff0c;顺序不能错. 三.Python 不定长参数 argc/*kargcs 实战四.Python 不定长参数 argc/*kargcs …

外卖小哥是怎样炼成的?

图片来源&#xff1a;网络作者小鹏/陈万成/阮田来源城市数据团原创作品&#xff0c;如有转载&#xff0c;请联系公众号授权。在中国&#xff0c;外卖用户规模已达3.6亿&#xff0c;日均订单量上千万。为了服务这些嗷嗷待哺的食客&#xff0c;有超过百万数量的外卖骑手奔波在全国…

Python 匿名函数 lambda - Python零基础入门教程

目录 一.Python 匿名函数 lambda 语法二.Python 匿名函数 lambda 调用 1.lambda 匿名函数常规使用2. lambda 匿名函数使用不定长参数3. lambda 匿名函数作为参数使用 三.Python 匿名函数 lambda 重点总结&#xff1a;四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录…

必须建筑师附体!像盖大楼那样打造数据即服务

近两年产业界总用“数据洪流”来形容数据的大爆发&#xff0c;但如果我们真把它视作洪水&#xff0c;那么它只会带来冲击&#xff1b;如能积极发掘其潜藏的价值&#xff0c;它则可能变成一条流金之河&#xff0c;正如麦肯锡在研究中发现的那样&#xff1a;与竞争对手相比&#…

华为鸿蒙用着怎么样,首批华为鸿蒙用户体验如何?“差评”有点难听,但是很真实!...

为了实现国产替代&#xff0c;打破海外企业对操作系统的垄断。华为集团推出了鸿蒙操作系统&#xff0c;这是一款真正意义上的国产操作系统&#xff0c;可以从一定程度上突破海外企业对手机操作系统的限制 。当然&#xff0c;一款操作系统的发展需要广大用户的支持&#xff0c;尽…