参考代码:

#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语言代码)相关推荐

  1. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法

    //二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...

  2. Java实现 二叉搜索树算法(BST)

    一.树 & 二叉树 树是由节点和边构成,储存元素的集合.节点分根节点.父节点和子节点的概念. 如图:树深=4; 5是根节点:同样8与3的关系是父子节点关系. 二叉树binary tree,则加 ...

  3. 真c++ 从二叉树到红黑树(4)之二叉平衡搜索树AVL

      此文章为从二叉树到红黑树系列文章的第四节,主要介绍介绍二叉平衡搜索树AVL,当你理解了AVL,红黑树你就理解了一半了! 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.由BST引入 ...

  4. 最优二叉搜索树算法 java实现

    最优二叉搜索树 定义 数据集:S=[x1,x2,-,xn]S=[x_1, ~x_2,~\dots~, ~x_n]S=[x1​, x2​, - , xn​] 截图来自:北大公开课 算法设计与分析 最优二 ...

  5. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...

    已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...

  6. 数据结构---二叉平衡排序树的删除

    数据结构-二叉平衡排序树的删除 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlT ...

  7. Python:实现最优二叉搜索树算法(附完整源码)

    Python:实现最优二叉搜索树算法 import sys from random import randintclass Node:def __init__(self, key, freq):sel ...

  8. 二叉平衡(AVL)树中的 LL旋转、RR旋转、LR旋转、RL旋转 的详细解释

    文章目录 前言 一.旋转的分类 1.LL失衡 2.RR失衡 3.LR失衡 4.RL失衡 二.实现LL平衡旋转 三.实现RR平衡旋转 四.实现LR平衡旋转 五.实现RL平衡旋转 前言 我们知道在二叉平衡 ...

  9. 二叉搜索树算法演示视频

    二叉搜索树算法演示视频

最新文章

  1. 4 次版本迭代,我们将项目性能提升了 360 倍!
  2. Delphi中关于Rtti的一些操作(一)
  3. jmeter测试元件--控制器
  4. java ftp 读取 txt文件_java通过ftp方式读取文件,并解析入库
  5. 46㎡老公房,经建筑设计师神级爆改,中国母子哭了出来
  6. UI界面设计视觉设计参考模板,解剖分层看如何更好的运用排版法则
  7. AI迎来重要发展契机,开发者的机会在哪里?
  8. 【Kettle】job中设置自动发送邮件
  9. 解决visual studio换行(回车键)不能代码补全问题
  10. EP Limited: 开源ECG分析软件介绍
  11. fixed不以body定位,相对于父级容器定位问题
  12. 学习自旋电子学的笔记02:OOMMF的报错和部分功能详述
  13. 如何做好软件安全性测试?
  14. sipp命令 各参数含义
  15. 网络工程师考试视频教程
  16. 微信公众号运营工具汇总
  17. ZeroDivisionError: integer division or modulo by zero
  18. hexo+yilia添加隐藏左边栏目按钮
  19. php输出26个英文字母,PHP 26个英文字母递增
  20. 谷氨酰胺合成酶(Glutamine synthetase,GS)试剂盒说明书

热门文章

  1. 寒假每日一题(提高组)【Week 1 完结】
  2. 3.2.1 虚拟内存的基本概念
  3. Spring boot自动注册DispatcherServlet
  4. 刚刚字节跳动发布了1200个java岗位,平均薪资40k
  5. 再见了,收费的Navicat
  6. Mybatis一级缓存,二级缓存的实现就是这么简单
  7. 非常强悍的 RabbitMQ 总结,写得真好
  8. 更新代码到gitlab上
  9. apache 版本_Apache Hudi 0.5.1版本重磅发布
  10. (Mybatis)使用注解开发