算法:avl树的实现

avl.h

#ifndef _AVLTREE_H
#define _AVLTREE_H

struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode AvlTree;
typedef PtrToNode Position;

AvlTree MakeEmpty(AvlTree T);
int Height(Position P);
Position Find(ElementType X,AvlTree T);
Position FindMax(AvlTree T);
Position FindMin(AvlTree T);
AvlTree Insert(ElementType X,AvlTree T);
AvlTree Delete(ElementType X,AvlTree T);

#endif

struct Node
{
    ElementType element;
    PtrToNode Left;
    PtrToNode Right;
    int Height;
};

avl.c

#include <stdlib.h>
#include <stdio.h>
#include "AvlTree.h"
#include "../../lib/common.h"

AvlTree MakeEmpty(AvlTree T)
{
    if(T!=NULL){
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }
    return NULL;
}
int Height(Position P)
{
    if(P==NULL){
        return -1;
    }else{
        return P->Height;
    }
}
Position Find(ElementType X,AvlTree T)
{
    if(T==NULL){
        return NULL;
    }else if(X<T->element){
        return Find(X,T->Left);
    }else if(X>T->element){
        return Find(X,T->Right);
    }
    return T;
}
Position FindMax(AvlTree T)
{
    if(T!=NULL){
        while(T->Right!=NULL){
            T=T->Right;
        }
    }
    return T;
}
Position FindMin(AvlTree T)
{
    if(T!=NULL){
        while(T->Left!=NULL){
            T=T->Left;
        }
    }
    return T;
}
AvlTree SingleRotateWithLeft(AvlTree T)
{
    Position P;
    P=T->Left;
    T->Left=P->Right;
    P->Right=T;
    T->Height=Max(Height(T->Left),Height(T->Right))+1;
    P->Height=Max(Height(P->Left),Height(P->Right))+1;
    return P;
}
AvlTree SingleRotateWithRight(AvlTree T)
{
    Position P;
    P=T->Right;
    T->Right=P->Left;
    P->Left=T;
    T->Height=Max(Height(T->Left),Height(T->Right))+1;
    P->Height=Max(Height(P->Left),Height(P->Right))+1;
    return P;
}
AvlTree DoubleRotateWithLeft(AvlTree T)
{
    T->Left=SingleRotateWithRight(T->Left);
    return SingleRotateWithLeft(T);
}
AvlTree DoubleRotateWithRight(AvlTree T)
{
    T->Right=SingleRotateWithLeft(T->Right);
    return SingleRotateWithRight(T);
}
AvlTree Insert(ElementType X,AvlTree T)
{
    if(T==NULL){
        T=malloc(sizeof(struct Node));
        if(T==NULL){
            printf("out of space");
            exit(1);
        }else{
            T->Left=T->Right=NULL;
            T->Height=0;
        }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=DoubleRotateWithRight(T);
                }else{
                    T=SingleRotateWithRight(T);
                }
            }
        }
        T->Height=Max(Height(T->Left),Height(T->Right))+1;
        return T;
    }
}
时间: 2024-10-11 00:45:26

算法:avl树的实现的相关文章

[数据结构与算法] : AVL树

头文件 1 typedef int ElementType; 2 3 #ifndef _AVLTREE_H_ 4 #define _AVLTREE_H_ 5 6 struct AvlNode; 7 typedef struct AvlNode *Position; 8 typedef struct AvlNode *AvlTree; 9 10 AvlTree MakeEmpty(AvlTree T); 11 Position Find(ElementType X, AvlTree T); 12

《树》之AVL树

本文简介: AVL树的简单介绍 AVL树几种实现方法的对比 AVL树删除节点的分析 AVL树插入节点的分析 AVL树ADT的简单实现 一.简介 定义:    AVL(Adlson-Velskii和Landis)树是带有平衡条件的二查查找树.对于AVL树来说,其平衡条件有两点限制: ⑴易于保持; ⑵保证树的深度为O(log N). 二.AVL树几种实现方法的对比 几种平衡条件的讨论 ⑴树上每个节点都必须要有相同高度的左子树和右子树: 在该平衡条件下,记根节点的高度为0,则高度为K的AVL树,其节点

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

算法学习 - 平衡二叉查找树实现(AVL树)

平衡二叉查找树 平衡二叉查找树是很早出现的平衡树,因为所有子树的高度差不超过1,所以操作平均为O(logN). 平衡二叉查找树和BS树很像,插入和删除操作也基本一样,但是每个节点多了一个高度的信息,在每次插入之后都要更新树的每个节点的高度,发现不平衡之后就要进行旋转. 单旋转 单旋转是碰到左左或者右右的情况下所使用的方法. 例如: 3 2 1 这种情况就需要旋转,因为3是根节点,它的左子树高度为0,右子树高度为2,相差超过1了,所以要进行旋转,而这是右右的情况,所以是单旋转. 2 / 1 3 这

红黑树和AVL树的实现与比较-----算法导论

一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以下五个性质: 1) 每个结点或是红色或是黑色 2) 根结点是黑色 3) 每个叶结点是黑的 4)如果一个结点是红的,则它的两个儿子均是黑色 5) 每个结点到其子孙结点的所有路径上包含相同数目的黑色结点 本实验主要实现红黑树的初始化,插入和删除操作.当对红黑树进行插入和 删除操作时,可能会破坏红黑树的五

算法学习笔记 平衡二叉树 AVL树

AVL树是最先发明的自平衡二叉查找树, 其增删查时间复杂度都是 O(logn), 是一种相当高效的数据结构.当面对需要频繁查找又经常增删这种情景时,AVL树就非常的适用.[ 博客地址:http://blog.csdn.net/thisinnocence ] AVL树定义 AVL树诞生于 1962 年,由 G.M. Adelson-Velsky 和 E.M. Landis 发明.AVL树首先是一种二叉查找树.二叉查找树是这么定义的,为空或具有以下性质: 若它的左子树不空,则左子树上所有的点的值均小

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

[算法] 数据结构之AVL树

1 .基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 1.1  AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1. 本身首先是一棵二叉搜索树. 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5              5 / \            / \ 2   6         

【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree

1.   红黑树(Red-Black Trees) 参考<算法导论>P308页,红黑树是一种对树的高度要求最灵活的准平衡二叉搜索树.五大属性: 1: Every node is either RED or BLACK. 2: The root is black. 3: Every leaf(NIL) is black.  (The NIL is the sentinel.) 4: If a node is RED, then both its children areblack. 5: For

AVL树的JAVA实现及AVL树的旋转算法

1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. 2,为什么需要AVL树呢?在二叉查找树中最坏情况下查找某个元素的时间复杂度为O(n),而AVL树能保证查找操作的时间复杂度总为O(logn). 3,AVL树的JAVA代码实现: AVLTree  继承 BinarySearchTree 并改写 添加节点的add方法,在add方法中判断插入元素后是否