二叉平衡树算法c语言,算法9-9~9-12:平衡二叉树的基本操作 (C语言代码)
参考代码:
#include
#include
#define True 1
#define False 0
#define EH 0
#define LH 1
#define RH -1
typedef int ElemType;
typedef struct BSTNode{
ElemType data;
int bf;
struct BSTNode *lchild, *rchild;
} BSTNode, *BSTree;
void LeftRotate(BSTree *p);
void RightRotate(BSTree *p);
void LeftBalance(BSTree *T);
void RightBalance(BSTree *T);
int InsertAVL(BSTree *T, ElemType key, int *taller);
int SearchKey(BSTree T, ElemType key);
void Free(BSTree *T);
int main()
{
BSTree T = NULL;
int n, k, key;
int taller;
scanf("%d%d", &n, &k);
while(n--){
scanf("%d", &key);
InsertAVL(&T, key, &taller);
}
while(k--){
scanf("%d", &key);
printf("%d ", SearchKey(T, key));
}
printf("\n");
Free(&T);
return 0;
}
void LeftRotate(BSTree *p){
BSTNode *t = (*p)->rchild;
(*p)->rchild = t->lchild;
t->lchild = *p;
*p = t;
}
void RightRotate(BSTree *p){
BSTNode *t = (*p)->lchild;
(*p)->lchild = t->rchild;
t->rchild = *p;
*p = t;
}
void LeftBalance(BSTree *T){
BSTNode *lc = (*T)->lchild;
switch(lc->bf){
case LH:{
lc->bf = (*T)->bf = EH;
RightRotate(T);
break;
}
case RH:{
BSTNode *lr = lc->rchild;
switch(lr->bf){
case EH:{
lc->bf = (*T)->bf = EH;
break;
}
case LH:{
lc->bf = EH;
(*T)->bf = RH;
break;
}
case RH:{
lc->bf = LH;
(*T)->bf = EH;
break;
}
}
lr->bf = EH;
LeftRotate(&(*T)->lchild);
RightRotate(T);
}
}
}
void RightBalance(BSTree *T){
BSTNode *rc = (*T)->rchild;
switch(rc->bf){
case RH:{
rc->bf = (*T)->bf = EH;
LeftRotate(T);
break;
}
case LH:{
BSTNode *rl = rc->lchild;
switch(rl->bf){
case EH:{
rc->bf = (*T)->bf = EH;
break;
}
case RH:{
rc->bf = EH;
(*T)->bf = LH;
break;
}
case LH:{
rc->bf = RH;
(*T)->bf = EH;
break;
}
}
rl->bf = EH;
RightRotate(&(*T)->rchild);
LeftRotate(T);
}
}
}
int InsertAVL(BSTree *T, ElemType key, int *taller){
if(!*T){
*T = (BSTNode *)malloc(sizeof(BSTNode));
(*T)->bf = EH;
(*T)->data = key;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
*taller = True;
return True;
}
else if(key == (*T)->data){
*taller = False;
return False;
}
else if(key data){
if(InsertAVL(&(*T)->lchild, key, taller) == False){
return False;
}
if(*taller == True){
switch((*T)->bf){
case EH:{
(*T)->bf = LH;
break;
}
case RH:{
(*T)->bf = EH;
*taller = False;
break;
}
case LH:{
LeftBalance(T);
*taller = False;
break;
}
}
}
return True;
}
else{
if(InsertAVL(&(*T)->rchild, key, taller) == False){
return False;
}
if(*taller == True){
switch((*T)->bf){
case EH:{
(*T)->bf = RH;
break;
}
case LH:{
(*T)->bf = EH;
*taller = False;
break;
}
case RH:{
RightBalance(T);
*taller = False;
break;
}
}
}
}
return True;
}
int SearchKey(BSTree T, ElemType key){
BSTNode *p = T;
while(p){
if(key == p->data) return True;
else if(key data) p = p->lchild;
else p = p->rchild;
}
return False;
}
void Free(BSTree *T) {
if (*T) {
Free(&(*T)->lchild);
Free(&(*T)->rchild);
free(*T);
*T = NULL;
}
}
二叉平衡树算法c语言,算法9-9~9-12:平衡二叉树的基本操作 (C语言代码)相关推荐
- 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...
- Java实现 二叉搜索树算法(BST)
一.树 & 二叉树 树是由节点和边构成,储存元素的集合.节点分根节点.父节点和子节点的概念. 如图:树深=4; 5是根节点:同样8与3的关系是父子节点关系. 二叉树binary tree,则加 ...
- 真c++ 从二叉树到红黑树(4)之二叉平衡搜索树AVL
此文章为从二叉树到红黑树系列文章的第四节,主要介绍介绍二叉平衡搜索树AVL,当你理解了AVL,红黑树你就理解了一半了! 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.由BST引入 ...
- 最优二叉搜索树算法 java实现
最优二叉搜索树 定义 数据集:S=[x1,x2,-,xn]S=[x_1, ~x_2,~\dots~, ~x_n]S=[x1, x2, - , xn] 截图来自:北大公开课 算法设计与分析 最优二 ...
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...
- 数据结构---二叉平衡排序树的删除
数据结构-二叉平衡排序树的删除 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlT ...
- Python:实现最优二叉搜索树算法(附完整源码)
Python:实现最优二叉搜索树算法 import sys from random import randintclass Node:def __init__(self, key, freq):sel ...
- 二叉平衡(AVL)树中的 LL旋转、RR旋转、LR旋转、RL旋转 的详细解释
文章目录 前言 一.旋转的分类 1.LL失衡 2.RR失衡 3.LR失衡 4.RL失衡 二.实现LL平衡旋转 三.实现RR平衡旋转 四.实现LR平衡旋转 五.实现RL平衡旋转 前言 我们知道在二叉平衡 ...
- 二叉搜索树算法演示视频
二叉搜索树算法演示视频
最新文章
- 4 次版本迭代,我们将项目性能提升了 360 倍!
- Delphi中关于Rtti的一些操作(一)
- jmeter测试元件--控制器
- java ftp 读取 txt文件_java通过ftp方式读取文件,并解析入库
- 46㎡老公房,经建筑设计师神级爆改,中国母子哭了出来
- UI界面设计视觉设计参考模板,解剖分层看如何更好的运用排版法则
- AI迎来重要发展契机,开发者的机会在哪里?
- 【Kettle】job中设置自动发送邮件
- 解决visual studio换行(回车键)不能代码补全问题
- EP Limited: 开源ECG分析软件介绍
- fixed不以body定位,相对于父级容器定位问题
- 学习自旋电子学的笔记02:OOMMF的报错和部分功能详述
- 如何做好软件安全性测试?
- sipp命令 各参数含义
- 网络工程师考试视频教程
- 微信公众号运营工具汇总
- ZeroDivisionError: integer division or modulo by zero
- hexo+yilia添加隐藏左边栏目按钮
- php输出26个英文字母,PHP 26个英文字母递增
- 谷氨酰胺合成酶(Glutamine synthetase,GS)试剂盒说明书