【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)
#include<stdio.h>
#include "fatal.h" struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree; typedef int ElementType ; AvlTree MakeEmpty(AvlTree T);
Position Find(ElementType X,AvlTree T);
Position FindMin(AvlTree T);
Position FindMax(AvlTree T);
AvlTree Insert(ElementType X,AvlTree T);
AvlTree Delete(ElementType X,AvlTree T);
ElementType Retrieve(Position P); struct AvlNode
{
ElementType Element;
AvlTree left;
AvlTree right;
int height;
}; AvlTree MakeEmpty(AvlTree T)
{
if(T!=NULL)
{
MakeEmpty(T->left);
MakeEmpty(T->right);
free(T);
}
return NULL;
} Position Find(ElementType X,AvlTree T)
{
if(T==NULL)
return NULL;
if(X<T->Element)
return Find(X,T->left);
else if(X>T->Element)
return Find(X,T->right);
else
return T;
} Position FindMin(AvlTree T)
{
if(T==NULL)
return NULL;
if(T->left==NULL)
return T;
else
return FindMin(T->left);
} Position FindMax(AvlTree T)
{
if(T==NULL)
return NULL;
if(T->right==NULL)
return T;
else
return FindMax(T->right);
} static int Height(Position P)
{
if(P==NULL)
return -;
else
return P->height;
} static int Max(int Lhs,int Rhs)
{
return Lhs>Rhs?Lhs:Rhs;
}
//RR旋转
static Position SingleRotateWithLeft(Position K2)
{
Position K1;
K1=K2->left;
K2->left=K1->right;
K1->right=K2;
K2->height=Max(Height(K2->left),Height(K2->right))+;
K1->height=Max(Height(K1->left),Height(K2->right))+;
return K1;
}
//LL旋转
static Position SingleRotateWithRight(Position K1)
{
Position K2;
K2=K1->right;
K1->right=K2->left;
K2->left=K1;
K1->height=Max(Height(K1->left),Height(K1->right))+;
K2->height=Max(Height(K2->right),Height(K1->left))+;
return K2;
}
//LR旋转
static Position DoubleRotateWithLeft(Position K3)
{
K3->left=SingleRotateWithRight(K3->left); return SingleRotateWithLeft(K3);
} //RL旋转
static Position DoubleRotateWithRight(Position K3)
{
K3->right=SingleRotateWithLeft(K3->right);
return SingleRotateWithRight(K3);
} AvlTree Insert(ElementType X,AvlTree T)
{
if(T==NULL)
{
T=malloc(sizeof(struct AvlNode));
if(T==NULL)
FatalError("out of space!!!");
else
{
T->Element=X;
T->right=T->left=NULL;
}
}
else if(X<T->Element)
{
T->left=Insert(X,T->left);
if(Height(T->left)-Height(T->right)==)
{
if(X<T->left->Element)
T=SingleRotateWithLeft(T);
else
T=DoubleRotateWithLeft(T);
}
}
else if(X>T->Element)
{
T->right=Insert(X,T->right);
if(Height(T->right)-Height(T->left)==)
{
if(X>T->right->Element)
T=SingleRotateWithRight(T);
else
T=DoubleRotateWithRight(T);
}
}
T->height=Max(Height(T->left),Height(T->right))+;
return T;
} AvlTree Delete(ElementType X,AvlTree T)
{
Position TmpCell;
if(T==NULL)
Error("Element not found");
else if(X<T->Element)
{
T->left=Delete(X,T->left);
if(Height(T->right)-Height(T->left)==)
{
if(Height(T->right->left)>Height(T->right->right))
T=DoubleRotateWithRight(T);
else
T=SingleRotateWithRight(T);
}
}
else if(X>T->Element)
{
T->right=Delete(X,T->left);
if(Height(T->left)-Heighe(T->right)==)
{
if(Heighe(T->left->right)>Height(T->left->left))
T=DoubleRotateWithLeft(T);
else
T=SingleRotateWithLeft(T);
}
}
//找到要删除的节点就是根节点,且根节点的左右子树都不为空
else if(T->left&&T->right)
{
if(Height(T->left)>Height(T->right))
{
T->Element=FindMax(T->left)->Element;
T->left=Delete(T->Element,T->left);
}
else
{
T->Element=FindMin(T->right)->Element;
T->right=Delete(T->Element,T->right);
}
}
//找到是根节点,但是根节点有一个或者没有子节点
else
{
TmpCell=T;
if(T->left==NULL)
T=T->right;
else if(T->right==NULL)
T=T->left;
free(TmpCell);
}
T->height=Max(Height(T->left),Height(T->right))+;
return T;
} ElementType Retrieve(Position P)
{
if(P==NULL)
return -;
else
return P->Element;
}
fatal.h
#include <stdio.h>
#include <stdlib.h> #define Error( Str ) FatalError( Str )
#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )
【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)的更多相关文章
- AVL平衡二叉搜索树原理及各项操作编程实现
C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...
- 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
- 手写AVL平衡二叉搜索树
手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...
- 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...
- 看动画学算法之:平衡二叉搜索树AVL Tree
目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...
- java二叉搜索树原理与实现
计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...
- LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树
第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...
- convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...
随机推荐
- Zookeeper Curator API 使用
0. 原生 ZOOKEEPER JAVA API http://www.cnblogs.com/rocky-fang/p/9030438.html 1. 概述 Curator采用cache封装对事件 ...
- PyCharm导入包的问题
在此之前,我们说一下虚拟环境这个概念: 在django项目中,直接就安装各种package,可能会造成系统混乱,因为package之间会有依赖的.比方说,你现在直接装django,他会依赖其他的包(开 ...
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...
- python的逻辑运算符
函数就是特殊的变量(这个变量是不加引号的) 我们 如果直接打印一个函数的名字是直接打印这个函数的内存地址 python的运算符: 首先Python的运算符和其他语言的运算符都是一样的 都有:算数运 ...
- Python实例---基于页面的后台管理[简单版]
后台管理菜单 + 母板[css/content/js] 向后台提交数据[2种]: 1. 模态对话框(数据少操作,且Js复杂): form表单 :优点:简单,前端提交后后台处 ...
- css中的圣杯布局和双飞翼布局
圣杯布局 布局要求: 三列布局,中间自适应,两边定宽 中间栏要在浏览器优先渲染 允许任意列的高度最高 用最简单的CSS.最少的HACK语句 解释说明: 1.min-width:700px是为了当页面缩 ...
- Jmeter和LoadRunner的区别
1.Jmeter的架构跟LoadRunner原理一样,都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务器反馈的结果的一个过程. 2.分布式中间代 ...
- 省事之通用Makefile模版
现在编译方案都偏爱使用cmake解决问题,这两条做unity插件,还是用Makefile,居然忘得光光,好记性不如烂笔头. 后面,翻箱倒柜找到以前为炼金术写的Makefiel,发现还真是挺好用,贴出来 ...
- [COGS 2066]七十和十七
2066. 七十和十七 ★★★ 输入文件:xvii.in 输出文件:xvii.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 七十君最近爱上了排序算法,于是Ta ...
- pip 升级 Appium-Python-Client
第一种方法: pip install --upgrade Appium-Python-Client 如果出现权限提醒: sudo -H pip install --upgrade Appium-Pyt ...