AVL树

参考资料:
http://blog.csdn.net/xiaofan086/article/details/8294382
<数据结构与算法分析>-C语言描述 Mark Allens Weiss
承接上个二叉查找树:

/*
 * avl.h
 *
 *  Created on: 2016年4月3日
 *      Author: fay
 */

#ifndef AVL_H_
#define AVL_H_
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
//以下定义Avl树的节点
typedef struct TreeNode
{
    ElementType data;
    struct TreeNode * left;//定义左孩子
    struct TreeNode * right;//定义右孩子
    int height;

}*Position,*AvlTree;
AvlTree MakeEmpty(AvlTree T);
/*以下定义树查找操作,找到最大,最小元素*/
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 );
ElementType Retrieve(Position T);
/*定义返回树的高度*/
static int Height(AvlTree T);
/*中序遍历二叉树*/
void InOrderRecur(AvlTree T);



#endif /* AVL_H_ */
/*
 * avlTree.c
 *
 *  Created on: 2016年4月3日
 *      Author: fay
 */
#include "avl.h"
AvlTree MakeEmpty(AvlTree T) {
    if (T != 0) {
        MakeEmpty(T->left);
        MakeEmpty(T->right);
        free(T);
    }
    return 0;

}
Position Find(ElementType X, AvlTree T) {
    if (T == 0) {
        return 0;
    }
    if (X < T->data) {
        return Find(X, T->left);
    } else if (X > T->data) {
        return Find(X, T->right);
    } else {
        return T;
    }
}
Position FindMax(AvlTree T) {
    if (T == 0) {
        return 0;
    } else if (T->right != 0) {
        return FindMax(T->right);
    } else {
        return T;
    }
}
Position FindMin(AvlTree T) {
    if (T == 0) {
        return 0;
    } else if (T->left != 0) {
        return FindMin(T->left);
    } else {
        return T;
    }
}
ElementType Retrieve(Position T) {
    return T->data;
}
static int Max(int h1, int h2) {
    return h1 > h2 ? h1 : h2;
}
static int Height(Position T) {
    if (T == 0) {
        return -1;
    } else {
        return T->height;
    }
}

static Position SingleRotateWithLeft(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(K2->right))+1;
    return K1;
}
static Position SingleRotateWithRight(Position K1){
    Position K2;
    K2=K1->right;
    K1->right=K2->left;
    K2->left=K1;
    K1->height=Max(Height(K1->left),Height(K1->right))+1;
    K2->height=Max(Height(K1->left),Height(K2->right))+1;
    return K1;
}
static Position DoubleRotateWithLeftRight(Position K3){
    Position K1=K3->left;
    K3->left=SingleRotateWithRight(K1);
    return SingleRotateWithLeft(K3);
}
static Position DoubleRotateWithRightLeft(Position K1){
    Position K3=K1->right;
    K1->right=SingleRotateWithLeft(K3);
    return SingleRotateWithRight(K1);
}
/*插入节点需要注意平衡二叉树,任意节点的左右子树的高度差不得大于1*/
AvlTree Insert(ElementType X, AvlTree T) {
    //树等于空的情形
    if (T == 0) {
        T = (AvlTree) malloc(sizeof(struct TreeNode));
        if (T == 0) {

        } else {
            T->data = X;
            T->height = 0;
            T->left = T->right = 0;
        }
    } else if (X < T->data) {
        //插入节点需要判断左右子树的高度
        T->left = Insert(X, T->left);
        if (Height(T->left) - Height(T->right) == 2) {
            //左左的情形,单旋转
            if (X < T->left->data) {
                T = SingleRotateWithLeft(T);
            } else {
                //左右双旋转
                T = DoubleRotateWithLeftRight(T);
            }
        }

    } else if (X > T->data) {
        T->right = Insert(X, T->right);
        if (Height(T->left) - Height(T->right) == 2) {
            //右右的情形,单旋转
            if (X < T->left->data) {
                T = SingleRotateWithRight(T);
            } else {
                //右左双旋转
                T = DoubleRotateWithRightLeft(T);
            }
        }
    }
    T->height = Max(Height(T->left), Height(T->right)) + 1;
    return T;
}
AvlTree Delete(ElementType X, AvlTree T) {
    Position temp;
    if (T == 0) {
        return 0;
    } else if (X < T->data) {
        printf(" X < T->data %d ", T->data);
        T->left = Delete(X, T->left);
    } else if (X > T->data) {
        T->right = Delete(X, T->right);
        printf(" X > T->data %d ", T->data);
    }
    /*以下为找到了要删除的节点分为三种情况*/
    else if (T->left && T->right) { //要删除的节点有左儿子和右儿子
        printf("X == T->data %d", T->data);
        temp = FindMin(T->right);
        printf("FindMin %d", temp->data);
        T->data = temp->data;
        //好难理解 妹滴
        T->right = Delete(T->data, temp->right);
    } else { //只有一个儿子或没有儿子
        temp = T;
        if (T->left == 0) {
            T = T->right;
        } else if (T->right == 0) {
            T = T->left;
        }
        free(temp);
    }
    return T;
}
/*
 * 中序遍历输出
 */
void InOrderRecur(AvlTree T) {
    static int n = 0;
    if (0 != T) {
        InOrderRecur(T->left);
        printf("%d \n", T->data);
        InOrderRecur(T->right);
    }
}
/**
 * 先根遍历
 */
void PreOrderRecur(AvlTree T) {
    static int n = 0;
    if (0 != T) {
        printf("%d \n", T->data);
        PreOrderRecur(T->left);
        PreOrderRecur(T->right);
    }
}

/*
 * functionAvl.c
 *
 *  Created on: 2016年4月3日
 *      Author: fay
 */
#include"avlTree.c"
#define N 15
int main(void) {
    AvlTree T=0;
    int i;
    int j = 0;
    T = MakeEmpty(0 );
    for( i = 0; i < N; i++, j = ( j + 7 ) % 50 )
    {
        printf("j=%d \n",j);
        T = Insert( j, T );
    }
   // puts("插入 4 \n");
   // T = Insert( 4, T );
    InOrderRecur(T);
    printf("================");
    printf("height=%d \n",T->height);
    InOrderRecur(T);

    printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
               Retrieve( FindMax( T ) ) );
    return EXIT_SUCCESS;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值