【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)

简介: #include #include "fatal.h" struct AvlNode; typedef struct AvlNode *Position; typedef struct AvlNode *AvlTree; typedef int ElementType ; ...
#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 -1;
    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))+1;
    K1->height=Max(Height(K1->left),Height(K2->right))+1;
    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))+1;
    K2->height=Max(Height(K2->right),Height(K1->left))+1;
    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)==2)
        {
            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)==2)
       {
           if(X>T->right->Element)
               T=SingleRotateWithRight(T);
           else
               T=DoubleRotateWithRight(T);
        }
    }
   T->height=Max(Height(T->left),Height(T->right))+1;
   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)==2)
        {
            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)==2)
        {
            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))+1;
    return T;
}

ElementType Retrieve(Position P)
{
    if(P==NULL)
        return -1;
    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 )

 

相关文章
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
730 4
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
488 1
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
589 1
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
573 7
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
834 8
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
335 2
|
自然语言处理 编译器 Linux
C语言中抽象的编译和链接原理
C语言中抽象的编译和链接原理
177 1
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
503 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
253 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
648 3

热门文章

最新文章

下一篇
开通oss服务