AVL平衡二叉树实现
#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平衡二叉树实现的更多相关文章
- 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
		数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ... 
- 3.1 C语言_实现AVL平衡二叉树
		[序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ... 
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
		树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ... 
- AVL平衡二叉树
		AVL树 1.若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值. 2.若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值. 3.它的左右子树也分别可以充当为二叉查找树. 例如: ... 
- 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 ... 
- AVL平衡二叉树实现,图解分析,C++描述,完整可执行代码
		body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ... 
- 查找(AVL平衡二叉树)
		[1]为什么需要平衡二叉树? 矛盾是推进事物向前发展的源动力. 那么平衡二叉树是从哪里来?肯定是有矛盾存在的.请看程来师的分析: [2]什么是平衡二叉树? 平衡二叉树的基本认识: [3]平衡二叉树的构 ... 
- AVL平衡二叉树的各种问题(Balanced Binary Tree)
		AVL树或者是一棵空树,或者是具有以下性质的非空二叉搜索树: 1. 任一结点的左.右子树均为AVL树: 2.根结点左.右子树高度差的绝对值不超过1. 1.声明 #include<iostream ... 
- Java数据结构(十四)—— 平衡二叉树(AVL树)
		平衡二叉树(AVL树) 二叉排序树问题分析 左子树全部为空,从形式上看更像一个单链表 插入速度没有影响 查询速度明显降低 解决方案:平衡二叉树 基本介绍 平衡二叉树也叫二叉搜索树,保证查询效率较高 它 ... 
随机推荐
- Unity性能优化之特效合并
			特效合并,意思是说将粒子所用的零碎图片,以shader为单位合并成一张图集,好处就是可以降低draw call.试想,合并前每个粒子使用一个material,而每一个material就要占用一个dra ... 
- POJ 2154 color (polya + 欧拉优化)
			Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). You ... 
- vue的一些感想
			如今vue2.0是主流,但是它的路由确实直接从1.0过来的,其中包括组件包括全局组件和局部组件,写好组件之后,我们就需要 使用路由,将组件关联起来,关联起来之后,然后我们才可以将组件的内容通过hash ... 
- 在Qt Quick中一个简单Hello World加载过程
			Qt5基本类图: QQmlEngine QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次架构,QML提供了一个默认的QML上下文(根上下文,获取函数QQmlEngi ... 
- John Deere Service Advisor EDL V2 Diagnostic Kit
			Support Languages: English, French, German, Italian, Portuguese, Russian, Spanish. John Deere Servic ... 
- samba服务器笔记 (一)
			Samba安装 samba:主服务包:samba-client:客户端:samba-common:通用工具:samba4-libs:库:samba-winbind:windows域映射:samba-w ... 
- 怎样从外网访问内网Resin
			外网访问内网Resin 本地安装了Resin,只能在局域网内访问,怎样从外网也能访问本地Resin? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Resin 默认安装的Resin端口 ... 
- mysql插入数据报错1366
			数据表插入中文数据报错 Warning Code : 1366 Incorrect string value: '\xE5\x9C\xA8' for column 'name' at row 1 原因 ... 
- keepalived + lvs
			Keepalived原理 Keepalived原理 keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件 core check vrrp libipfwc li ... 
- 自制操作系统Antz(3)——进入保护模式 (中) 直接操作显存
			Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ... 
