用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…

c语言偶数分解成两个素数,如何用C语言验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和....

题目&#xff1a;如何用C语言验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和.我是大一新生,代码不能太复杂解答&#xff1a;//首先生成质数表,然后双重循环输出2000以内所有偶数的两个质数和的形式#include#includebool isPrime(int n){\x09int i;\x…

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 基础入…

四则运算计算器c语言switch,设计一个五个数进行四则运算的计算器 c语言

2016-02-24 回答dlib.hint fun1(int *i,int *j){int a,b,c,d,e0;arandom(100);brandom(100);dab;(*j);while (e3){printf(%d%d,a,b);e;scanf(%d,c);if(cd) {printf(回答正确\n);(*i);break;}else{printf(对不起&#xff0c;你的答案错误\n);};}}int fun2(int *i,int *j){int a,…

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

作者孙浩峰原创作品&#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…

android unix时间,android: 日期转Unix时间戳,Unix时间戳转日期,带时区

1、UTC时间&GMT时间UTC时间是时间标准时间(Universal Time Coordinated)&#xff0c;UTC是根据原子钟来计算时间&#xff0c;误差非常小。UTC也是指零时区的时间&#xff0c;如果要表示其他时区的时间&#xff0c;这里要注意没有UTC0800或者UTC8这样的表示方式(至少Java里面…

Python 函数声明和调用 - Python零基础入门教程

目录 一.前言二.Python 函数定义三.Python 函数的调用四.Python 函数传参 1.Python 函数常规参数2.Python 函数缺省参数3.Python 函数不定长参数 五.Python 函数返回值 return六.Python 函数重点总结七.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho…

多亏它,让大家做好“山竹”来袭的准备【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;加入【云计算学习交流群】&…

华为android o适配名单,Android 12首批适配名单公布:没有华为、荣耀

谷歌已经正式发布了Android12&#xff0c;新的系统底层带来了3个改动&#xff1a;更丰富的视觉元素&#xff0c;更全面的隐私保护&#xff0c;并且开始引入“多设备互联”的概念。说实话&#xff0c;Android12的更新只能用“循规蹈矩”来形容&#xff0c;没什么可惊讶的。有趣的…