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树) 二叉排序树问题分析 左子树全部为空,从形式上看更像一个单链表 插入速度没有影响 查询速度明显降低 解决方案:平衡二叉树 基本介绍 平衡二叉树也叫二叉搜索树,保证查询效率较高 它 ...
随机推荐
- 接口测试工具-Jmeter使用笔记(六:从文本读取参数)
使用场景:测试一个接口并发处理数据的能力,并且每次请求传入的参数都要不同. 解决方法--- CSV Data Set Config 列举一个实例,步骤中会侧重读取参数操作的说明,其他有疑问的步骤请查阅 ...
- vue -about
j基于webpack4 搭建vue 环境:https://juejin.im/post/5bc30d5fe51d450ea1328877
- xampp lampp 改变网页root目录的方法
This is an old question but I haven't seen it properly answered yet. Here is what you need to do: In ...
- python笔记-文件读写
文件操作过程一般为:打开.读写.关闭: 打开:open()或file() 读写:read().write(): 关闭:close(): 1.打开:open()或file() file_handler= ...
- ionic 需要注意的知识点
- 深入理解Java虚拟机1-chap1-2-斗之气8段
1.HotSpot VM:热点代码探测能力,与JIT技术共同进行编译优化,输出高质量代码 2.运行时数据区域 程序计数器:控制程序执行顺序,无OOM Java虚拟机栈:生命周期与线程一致,描述Java ...
- C# 获取结构体的所有成员
读取结构体的所有成员(Engine为结构体) FieldInfo[] fieldInfos = typeof(Engine).GetFields();
- java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***
Spring AOP 有两种代理方法, 一种是常规JDK,一种是CGLIB. 当代理对象实现了至少一个接口时,默认使用JDK动态创建代理对象: 当代理对象没有实现任何接口时,就会使用CGLIB方法. ...
- P1996 约瑟夫问题
P1996 约瑟夫问题 广度优先搜索 我竟然寄几做对了 这个题用到了队列 下面详细解释: 我的代码: #include<iostream> #include<cstdio> # ...
- sqlalchemy orm介绍
ORM介绍 简解:用户会使用ORM时会直接访问对象,对象在通过ORM与数据库进行交互,不需要用户操作sql. 详解:orm英文全称object relational mapping,就是对象映射关系程 ...