#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. 原型链中的prototype、__proto__和constructor的关系

    先来看一张图,这张图可以说是围绕以下代码完整的描述了各对象之间的关系.接下来我们来看看如何一步步画出这张图. function Foo(){}; var foo = new Foo(); 首先,明确几 ...

  2. 让你跟上nodejs的资源

    For a long time, JavaScript developers hoped for a server-side solution that would allow them to ful ...

  3. webpack+vue2实现旅游网小demo

    这两天自己练习做了一个webpack+vue2的旅游app小项目,涉及到的内容是vue组件.vue路由以及webpack打包.         目录文件设计: 有兴趣的可到我的百度网盘下载 链接: h ...

  4. jQuery 所有版本在线引用

    jquery-3.1.1(最新) 官网jquery压缩版引用地址: <script src="https://code.jquery.com/jquery-3.1.1.min.js&q ...

  5. IEC62304开发过程框架

    软件开发计划的任务 制定整体软件开发计划 制定设计和开发计划 规划软件开发的工具.标准和方法(Class C) 制定软件集成和集成计划 制定软件验证计划 制定软件风险管理计划 制定配置管理计划 软件需 ...

  6. 实战:Nginx如何让用户通过用户名和密码认证访问WEB站点

    有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些 ...

  7. select server

    server with select #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> ...

  8. Java实例---简单的宠物管理系统

    代码分析 Cat.java package com.ftl.petshop; class Cat implements Pet { private String name; private Strin ...

  9. 搭建spring boot+elasticsearch+activemq服务

    目前时间是:2017-01-24 本文不涉及activemq的安装 需求 activemq实时传递数据至服务 elasticsearch做索引 对外开放查询接口 完成全文检索 环境 jdk:1.8 s ...

  10. 用windows公文包实现不同盘符两个文件文件夹文件同步

    需求:磁盘D的文件夹A需同步到磁盘E 步骤: 1.在磁盘E中新建公文包B 2.将D盘的文件夹A复制到公文包B 3.修改文件夹A中的内容 4.选中公文包B,右键"全部更新"