浙大 PAT 甲级 1066 Root of AVL Tree 带有平衡条件的二叉查找树

本题直白地考查纯粹的数据结构知识,根据模板实现AVL树即可。对AVL树及其例程的介绍,目前找到的最清晰、易懂、完整的是《数据结构与算法分析-C语言描述》。

// AVL 平衡二叉搜索树

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>

struct AvlNode;
typedef struct AvlNode *AvlTree;

struct AvlNode
{
    int Element;
    AvlTree Left;
    AvlTree Right;
    int Height;
};

AvlTree SingleRotateWithLeft(AvlTree T);
AvlTree DoubleRotateWithLeft(AvlTree T);
AvlTree SingleRotateWithRight(AvlTree T);
AvlTree DoubleRotateWithRight(AvlTree T);

int getHeight(AvlTree T)
{
    if (T == NULL)
    {
        return -1;
    }
    else
    {
        return T->Height;
    }
}

AvlTree Insert(int x, AvlTree T)
{
    if (T == NULL)
    {
        // Create and return a one-node tree
        T = (AvlNode*)malloc(sizeof(AvlNode));
        T->Element = x;
        T->Height = 0;
        T->Left = T->Right = NULL;
    }
    else if (x < T->Element)
    {
        T->Left = Insert(x, T->Left);
        if (getHeight(T->Left) - getHeight(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 (getHeight(T->Right) - getHeight(T->Left) == 2)
        {
            if (x < T->Right->Element)
            {
                T = DoubleRotateWithRight(T);
            }
            else
            {
                T = SingleRotateWithRight(T);
            }
        }
    }
    T->Height = std::max(getHeight(T->Left), getHeight(T->Right)) + 1;
    return T;
}

AvlTree SingleRotateWithLeft(AvlTree K2)
{
    AvlTree K1;
    K1 = K2->Left;
    K2->Left = K1->Right;
    K1->Right = K2;

    K2->Height = std::max(getHeight(K2->Left), getHeight(K2->Right)) + 1;
    K1->Height = std::max(getHeight(K1->Left), getHeight(K2)) + 1;
    return K1;
}

AvlTree SingleRotateWithRight(AvlTree K1)
{
    AvlTree K2;
    K2 = K1->Right;
    K1->Right = K2->Left;
    K2->Left = K1;

    K1->Height = std::max(getHeight(K1->Left), getHeight(K1->Right)) + 1;
    K2->Height = std::max(getHeight(K2->Left), getHeight(K1)) + 1;
    return K2;
}

AvlTree DoubleRotateWithLeft(AvlTree K3)
{
    // Rotate between K1 and K2
    K3->Left = SingleRotateWithRight(K3->Left);
    // Rotate between K3 and K2
    return SingleRotateWithLeft(K3);
}

AvlTree DoubleRotateWithRight(AvlTree K1)
{
    // Rotate between K2 and K3
    K1->Right = SingleRotateWithLeft(K1->Right);
    // Rotate between K1 and K2
    return SingleRotateWithRight(K1);
}

int main()
{
    int N;
    scanf("%d", &N);
    AvlTree T = NULL;
    for (int i = 0; i < N; i++)
    {
        int x;
        scanf("%d", &x);
        T = Insert(x, T);
    }
    printf("%d\n", T->Element);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值