#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.将验证码类文件夹放入到指定的位置,放入位置可以自定义 2.在控制器中引入验证码文件 3.在验证码文件中可以根据自己的需要,对验证码的内容进行编辑(包括背景,画线,边框,内容) 4.在入口文件中开启 ...

  2. C语言四舍五入算法

    对h进行四舍五入 1. 网络上搜索来的: C语言取整规则: (int)(h + 0.5) 2. 二级教程: 四舍五入并精确到小数点后面的第n位: 实例:

  3. (C#) 多线程访问探讨,如果保证线程安全?

    先抛出几点疑问: 1. 多个线程同时访问同一个“值类型变量“(value type, stored in stack), 如果保证安全访问? 2. 多个线程同时访问同一个“引用类型变量“(refere ...

  4. [转]Linux芯片级移植与底层驱动(基于3.7.4内核)

      1.   SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍.中断控制器.SMP启动.CPU hotplug以及底层的G ...

  5. day04之VUE痛悟

    vue组件组件分为三部分

  6. js重名的处理

    ### 关于重名的处理 > 在变量提升阶段,如果名字重复了,不会重新的进行声明,但是会重新的进行定义(后面赋的值会把前面赋的值给替换掉) ```javascript //=>变量提升:fn ...

  7. java笔记--String类对象解析与运用

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877236.html "谢谢-- 1.String中的equals和==的 ...

  8. 书籍管理系统 -----没有form组件

    urls: from django.contrib import admin from django.urls import path,re_path from first import views ...

  9. 使用CALayer制作View的辉光效果

    使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这 ...

  10. Linux入门-8 Linux系统启动详解

    系统启动流程 BIOS MBR GRUB KERNEL INIT 单用户修改root密码 GRUB加密 系统启动流程 BIOS MBR: Boot Code 执行引导程序 - GRUB 加载内核 执行 ...