#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语言)的更多相关文章

  1. AVL平衡二叉搜索树原理及各项操作编程实现

    C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...

  2. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  3. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  4. 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)

    背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...

  5. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  6. java二叉搜索树原理与实现

    计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...

  7. LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树

    第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...

  8. 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 ...

  9. 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)

    定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...

随机推荐

  1. laravel之引入图片上传类

    1.在官网http://www.uploadify.com/ 下载插件,flash verison 的版本是免费版 2.解压后将文件夹放置在指定的目录下 3.前端导入css,js文件,可以仿照文件夹中 ...

  2. ionic--配置路由

    1.ng-route index中引用文件: <script src="ionic.bundle.js"></script> <script src= ...

  3. 推荐js库: underscore

    Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率. 之间没用他之前,自己写,那是相当的酸爽. 如循环处理: for(var i=0;i<data.length; ...

  4. Intelij IDEA 配置Tomcat时找不到 “Application Server”

    由于公司突然断电,再打开idea的时候,tomcat就消失了.然后在网上搜了一下,没搜到自己乱点了一下. 如图 : plugins >>   application servers Vie ...

  5. FileWriter与BufferedWriter的适用场景

    IO这块,各种Writer,Reader,让人眼晕 而在网上基本找不到在什么时候用哪个类,并且网上的IO demo 很多用法都是错的 在这简单的分析一下FileWriter与BufferedWrite ...

  6. CSS标准文档流 块级元素和行内元素

    标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 空白折叠现象 ...

  7. Python学习---django之admin简介

    Django之admin简介 参考文献:http://www.admin10000.com/document/2220.html   Djaogo为什么url可以匹配url.py里面的路径呢? 我们打 ...

  8. 沉淀再出发:PHP的中级内容

    沉淀再出发:PHP的中级内容 一.前言     前面我们介绍了PHP的简单的语法知识以及相关的用法,接下来我们将PHP+mysql以及PHP+ajax结合起来进行研究. 二.PHP+mysql     ...

  9. August 20th 2017 Week 34th Sunday

    Life is not a race, but a journey to be savored each step of the way. 生活不是一场赛跑,而是每一步都应该细细品尝的人生旅程. No ...

  10. 008单例、继承、final

    内容:单例,类继承,final #################################################################################### ...