【算法学习】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 -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 )

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

时间: 2024-10-17 08:55:43

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

平衡二叉搜索树(AVL树)的原理及实现源代码(有图文详解和C++、Java实现代码)

一.AVL树(平衡二叉搜索树)是什么? AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个非叶子结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5             5 / \            /  \ 2   6         2   6 / \    \         / \ 1  4   7       1  4

平衡二叉搜索树(AVL树,红黑树)数据结构和区别

平衡二叉搜索树(Balanced Binary Search Tree) 经典常见的自平衡的二叉搜索树(Self-balancing Binary Search Tree)有 ① AVL树 :Windows NT 内核中广泛使用 ② 红黑树:C++ STL(比如 map.set )Java 的 TreeMap.TreeSet.HashMap.HashSet  Linux 的进程调度  Ngix 的 timer 管理 1 AVL树  vs  红黑树 ①AVL树 平衡标准比较严格:每个左右子树的高度

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

算法学习 - 优先队列的二叉堆实现

PriorityQuenue 优先队列就是作业调度类的ADT,这里用二叉堆来实现. 优先队列最少有两个操作:插入(Insert)和删除最小者(DeleteMin). 插入操作图解: 图片来源:www.educity.cn 删除操作图解: 图片来源:www.cfanz.cn 代码实现: // // main.cpp // binaryHeap // // Created by Alps on 14-8-17. // Copyright (c) 2014年 chen. All rights rese

判断是否AVL平衡二叉书

#include<iostream> #include<vector> #include<stack> #include<string> #include<queue> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),l

平衡二叉搜索树

AVL树又称高度平衡的二叉搜索树,是1962年俄罗斯的数学家提出来的.它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度. AVL的性质: (1)左子树和右子树的高度之差的绝对值不超过1. (2)树中的每个左子树和右子树都是AVL树. (3)每个节点都有一个平衡因子,任一节点的平衡因子是-1,0,1(每个节点的平衡因子等于右子树的高度减去左子树的高度). 代码实现如下: #include<iostream> using namespace std; template<c

C++ 二叉搜索树原理及其实现

首先是概念:二叉搜索树又称二叉排序树,它具有以下的性质: 若是左子树不为空,则左子树上所有节点的值小于根节点的值若是右子树不为空,则右子树上所有结点的值大于根节点的值二叉搜索树的左右子树也是二叉搜索树二叉搜索树的中序排列是一个有序数列再下来是它的实现 首先是构造节点: template<class K>struct BStreeNode{BStreeNode(const K& date = K()) //节点的定义:leftC(nullptr), // 初始化rightC(nullpt

平衡二叉搜索树/AVL二叉树 C实现

//AVTree.h 1 #ifndef MY_AVLTREE_H 2 #define MY_AVLTREE_H 3 typedef int ElementType; 4 struct TreeNode 5 { 6 ElementType data; 7 struct TreeNode *left; 8 struct TreeNode *right; 9 int height; 10 }; 11 typedef struct TreeNode TreeNode; 12 typedef TreeN

AVL平衡树 - 二叉搜索树的推广

AVL树的介绍 实现 1 旋转 LL左左 RR右右 LR左右 RL右左 2 插入 3 删除 性能 完整代码和参考资料 1. AVL树的介绍 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的. 它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 如上图(左):非AVL树,如对节点9,左子树高度为0,右子树高度为2 如上图(由):AVL树,对任意节点的两个子树高度