AVL树

来源:互联网 发布:nginx cgi 编辑:程序博客网 时间:2024/05/19 07:42

参考资料:
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 15int 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 0
原创粉丝点击