博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AVL树的实现例程
阅读量:6079 次
发布时间:2019-06-20

本文共 2254 字,大约阅读时间需要 7 分钟。

/* AVL树的节点声明 */#ifndef _AVLTREE_H#define _AVLTREE_Hstruct AvlNode;typedef struct AvlNode *Position;typedef struct AvlNode *AvlTree;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);#endif    /* _AVLTREE_H *//* Place in the implementation file */struct AvlNode{    ElementType Element;    AvlTree Left;    AvlTree Right;    int Height;};
/* 计算AVL节点的高度 */static intHeight(Position P){    if(P == NULL)        return -1;    else        return P->Height;}
/* 向AVL树插入节点的例程 */AvlTree Insert(ElementType X, AvlTree T){    if(T == NULL)    {        /* Create and return a one-node tree */        T = malloc(sizeof(struct AvlNode));        if(T == NULL)            FatalError("Out of space!!!");        else        {            T->Element = X;            T->Height = 0;            T->Left = NULL;            T->Right = 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);        }    }    /* Else X is in the tree already; we'll do nothing */    T->Height = Max(Height(T->Left), Height(T->Right)) + 1;    return T;}
/* 执行单旋转的例程 */static PostitionSingleRotateWithLeft(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(K1->Left)) + 1;        return K1;        /* New root */}
/* 执行双旋转的例程 */static PositionDoubleRotateWithLeft(Position K3){    /* Rotate between K1 and K2 */    K3->Left = SingleRotateWithLeft(K3->Left);    /* Rotate between K3 and K2 */    return SingleRotateWithLeft(K3);}

附图:

                                                     单旋转

                                                     双旋转

转载地址:http://ueqgx.baihongyu.com/

你可能感兴趣的文章
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
Q85 最大矩形
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
Android获取设备採用的时间制式(12小时制式或24小时制式)
查看>>
前端面试中的常见的算法问题
查看>>
CENTOS7下安装REDIS
查看>>