#include<stdio.h>
#include<stdlib.h> #define TRUE 1
#define FALSE 0
#define EH 0
#define LH 1
#define RH -1
//平衡二叉树的节点结构
typedef struct BiTNode{
int data;
int bf;//平衡因子
BiTNode *lchld,*rchild;
}BiTNode,*BiTree; typedef int Status;
//LL调整
void R_Rotate(BiTree &T)
{
BiTree p;
p=T->lchild;
T->lchild=p->rchild;
p->rchild=T;
T=p;
}
//RR调整
void L_Rotate(BiTree &T)
{
BiTree p;
p=T->rchild;
T->rchild=p->lchild;
p->lchild=T;
T=p;
}
//左平衡处理LL,LR
void LeftBalance(BiTree &T)
{
BiTree L,LR;
L=T->lchild;
switch(L->bf)
{
case :
L->bf=-;
T->bf=;
R_Rotate(T);
break;
case :
L->bf=T->bf=;
R_Rotate(T);
break;
case -:
LR=L->rchild;
switch(LR->bf)
{
case :
L->bf=T->bf=;
case -:
T->bf=;
L->bf=;
break;
case :
L->bf=;
T->bf=-;
break;
default:
break;
}
LR->bf=;
L_Rotate(T->lchild);
R_Rotate(T);
break;
default:
break;
}
}
//右平衡处理RR,RL
void RightBalance(BiTree &T)
{
BiTree R,RL;//调用函数,T为根,右边高于左边T->bf=-1;
R=T->rchild;//R是T的右孩子
switch(R->bf)
{
case -://如果T时右孩子和T它们的平衡因子相同,直接左旋。
T->bf=R->bf=;
L_Rotate(T);
break;
case :
T->bf=-;
R->bf=;
L_Rotate(T);
break;
case :
RL=R->lchild;
switch(RL->bf)
{
case :
T->bf=R->bf=;
break;
case -:
R->bf=;
T->bf=;
break;
case :
R->bf=-;
T->bf=;
break;
default:
break;
}
RL->bf=;
R_Rotate(T->rchild);
L_Rotate(T);
break;
}
} bool InsertAVLTree(BiTree &T,int key,bool taller)
{
if(!T)//T为空
{
T=(BiTree)malloc(sizeof(BiTNode));
T->bf=;
T->lchild=T->rchild=NULL;
T->data=key;
taller=true;
return true;
}
else
{
if(key==T->data)//已经存在key相同的元素,不用插入,返回false
{
taller=false;
return false;
}
if(key<T->data)//所插入的元素小于根的值,找他的左孩子比较
{
if(!InsertAVLTree(T->lchild,key,taller))
{
return false;
}
if(taller)
{
switch(T->bf)
{
case :
T->bf=;
taller=true;
break;
case :
LeftBalance(T);
taller=false;
break;
case -:
T->bf=;
taller=false;
break;
default:
break;
}
}
else
{
if(!InsertAVLTree(T->rchild,key,taller))
{
return false;
}
if(taller)
{
switch(T->bf)
{
case :
T->bf=-;
taller=true;
break;
case :
T->bf=;
taller=false;
break;
case -:
RightBalance(T);
taller=false;
break;
default:
break;
}
}
}
}
}
}

AVL平衡二叉树实现的更多相关文章

  1. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  2. 3.1 C语言_实现AVL平衡二叉树

    [序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ...

  3. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...

  4. AVL平衡二叉树

    AVL树 1.若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值. 2.若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值. 3.它的左右子树也分别可以充当为二叉查找树. 例如: ...

  5. PAT A1123 Is It a Complete AVL Tree (30 分)——AVL平衡二叉树,完全二叉树

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  6. AVL平衡二叉树实现,图解分析,C++描述,完整可执行代码

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. 查找(AVL平衡二叉树)

    [1]为什么需要平衡二叉树? 矛盾是推进事物向前发展的源动力. 那么平衡二叉树是从哪里来?肯定是有矛盾存在的.请看程来师的分析: [2]什么是平衡二叉树? 平衡二叉树的基本认识: [3]平衡二叉树的构 ...

  8. AVL平衡二叉树的各种问题(Balanced Binary Tree)

    AVL树或者是一棵空树,或者是具有以下性质的非空二叉搜索树: 1. 任一结点的左.右子树均为AVL树: 2.根结点左.右子树高度差的绝对值不超过1. 1.声明 #include<iostream ...

  9. Java数据结构(十四)—— 平衡二叉树(AVL树)

    平衡二叉树(AVL树) 二叉排序树问题分析 左子树全部为空,从形式上看更像一个单链表 插入速度没有影响 查询速度明显降低 解决方案:平衡二叉树 基本介绍 平衡二叉树也叫二叉搜索树,保证查询效率较高 它 ...

随机推荐

  1. Tomcat的日志分割三种方法

    一.Tomcat的日志分割三种方法 一.方法一:用cronolog分割tomcat的catalina.out文件 Linux 日志切割工具cronolog详解:https://blog.csdn.ne ...

  2. Vue+element 实现文件导出xlsx格式

    傻瓜教程:   第一步:安装两个依赖包 npm install --save xlsx file-saver 第二步:建立一个Vue文件,导入以下代码即可 <template> <d ...

  3. nginx----------nginx日志详细分解

    1.客户端(用户)IP地址.如:上例中的 47.52.45.228 2.访问时间.如:上例中的 [03/Jan/2013:21:17:20 -0600] 3.请求方式(GET或者POST等).如:上例 ...

  4. beego 初体验 - 基础模块 - session, cookie

    beego 内建 session 模块 首先,需要在项目中开启 Session,两种方式,以编码的方式或配置 这是代码实现: 配置文件: 这是调用:

  5. MySQL Workbench在archlinux中出现 Could not store password: The name org.freedesktop.secrets was not provided by any .service files的错误

    MySQL Workbench在archlinux中出现 Could not store password: The name org.freedesktop.secrets was not prov ...

  6. Select input 两个元素的宽度高度跟设定值不一致的问题

    在做登录框的时候,需要一个select 元素作为账号输入,一个input作为密码输入框.在css 文件中,将这两个元素的position 设置为relative ,并且width 设置为100%.刷新 ...

  7. vue-cli 2.92版本 server

    一.引包 const axios = require('axios'); const express = require('express'); const apiRoutes = express.R ...

  8. 用 python 生成一个简单的词云图

    import jieba from nltk import * from wordcloud import WordCloud import matplotlib.pyplot as plt word ...

  9. 爬虫----BeautifulSoup模块

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  10. Redis学习-set数据结构

    set 是无序集合,最大可以包含(2 的 32 次方-1)个元素.set 的是通过 hash table 实现的, 所以添加,删除,查找的复杂度都是 O(1) sadd key member 添加一个 ...