zoukankan      html  css  js  c++  java
  • 【算法学习】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
    ", Str ), exit( 1 )
  • 相关阅读:
    golang中的左值VS右值
    golang指针接收者和值接收者方法调用笔记
    go中如果想要实现别人写的接口,如何保证确实实现了那个接口而不是错过了什么?
    在windows中给git修改默认的编辑器为sublime
    git config 选项
    json包中的Marshal&Unmarshal 文档译本
    go的database/sql库中db.Exce()
    go中导入包的几种方式
    机器学习之分类和聚类的区别
    TP5.0学习笔记
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3806783.html
Copyright © 2011-2022 走看看