Root of AVL Tree

#include <stdio.h>

#include <stdlib.h>

typedef int ElementType;

typedef struct AvlNode *AvlTree;

typedef struct AvlNode *Position;

struct AvlNode

{

    ElementType Element;

    AvlTree Left;

    AvlTree Right;

    int Height;

};

AvlTree Insert(ElementType X, AvlTree T);

ElementType Retrieve(Position P);//通过位置P检索元素

///

int height(Position P);

Position SingleRotateWithleft(Position K2);

Position SingleRotatewithRight(Position K2);

Position DoubleRotateWithleft(Position K3);

Position DoubleRotateWithRight(Position K3);

int Max(int Value1, int Value2);

///


int main()

{

    int N;

    scanf("%d",&N);

    int Value;

    AvlTree T = NULL;

    while (N--) {

        scanf("%d",&Value);

        T = Insert(Value, T);

    }

    if (T) {

        printf("%d\n", T->Element);

    }

    return 0;

}

AvlTree Insert(ElementType X, AvlTree T)

{

    if (T == NULL) {

        //Creat and return a one-node tree

        T = malloc(sizeof(struct AvlNode));

        T->Element = X;

        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 = SingleRotatewithRight(T);

            }else

            {

                T = DoubleRotateWithRight(T);

            }

        }

    }

    //Eles X is in the tree already; we'll do nothing

    

    T->Height = Max(height(T->Left), height(T->Right))+1;

    return T;

}

int height(Position P)

{

    if (P == NULL) {

        return -1;

    }else

    {

        return P->Height;

    }

}

Position SingleRotateWithleft(Position K2)

{

    Position 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->Right))+1;

    return K1;

}

Position SingleRotatewithRight(Position K1)

{

    Position 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->Left), height(K2->Right))+1;

    return K2;

}

Position DoubleRotateWithleft(Position K3)

{

    K3->Left = SingleRotatewithRight(K3->Left);

    return SingleRotateWithleft(K3);

}

Position DoubleRotateWithRight(Position K3)

{

    K3->Right = SingleRotateWithleft(K3->Right);

    return SingleRotatewithRight(K3);

}

int Max(int Value1, int Value2)

{

    return Value1 > Value2 ? Value1 : Value2;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值