AVL树的插入与删除(均为递归实现)

本文详细介绍了AVL树的节点定义、辅助函数,特别是针对AVL树的插入和删除操作,包括左单旋转、右单旋转、左-右双旋转和右-左双旋转的实现,并提供了相应的代码示例。在插入和删除后,通过判断并修复失去平衡的节点,以保持AVL树的平衡特性。
摘要由CSDN通过智能技术生成
一. 引言
AVL树是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它必须保证树的深度是O(logN).一颗AVL树是其每个节点的左子树和右子树的高度最多差一的二叉查找树.
主要介绍插入算法和删除算法.
二. AVL树的结点定义:
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
typedef int ElementType;

struct AvlNode
{
    ElementType Element;
    AvlTree Left;
    AvlTree Right;
    int Height;
};
三. 各种辅助函数:
/*
 * 返回两个数中的最大值
 */
static int Max(int a, int b)
{
    if(a > b)
        return a;
    else
        return b;
}
/*
    在AVL树T中寻找元素值最小的节点,并将其返回
*/
Position FindMin(AvlTree T)
{
    if(T == NULL)
        return NULL;
    else
    if(T->Left == NULL)
        return T;
    else
        return FindMin(T->Left);
}
/*
 *  返回节点P的高度
 */
static int Height(Position P)
{
    if (P == NULL)
        return -1;
    else
        return P->Height;
}
四. 对AVL树进行修复的函数

1. 进行旋转的函数
左单旋转:
可以看到在结点k2处失去了平衡, 并且是在k2的左儿子的左子树上插入的,因此对k2结点进行左单旋转,即将k1作为新的根节点,将k2作为其右儿子,原来k2的右儿子作为k2的左结点,详见示意图(图丑勿怪^_^).
左单旋转示意图
左单旋转的代码:

/*
 * 左单旋转
 */
static Position SingleRotateWithLeft(Position K2)
{
    Position K1;

    K1 = K2->Left;
    K2->Left = K1->Right;
    K1->Right = K2;

    //K2的子节点的高度都没有变化,不需更改
    K2->Height 
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值