二叉平衡树树的实现

来源:互联网 发布:mac如何下载土豆视频 编辑:程序博客网 时间:2024/06/05 22:48

      AVL树的具体概念这里不做介绍,可参考AVL,只给出代码构建AVL树的代码实现(基于《数据结构与算法分析——C语言版》)

#include <stdio.h>#include <stdlib.h>struct AvlNode;typedef struct AvlNode *Position;typedef struct AvlNode *AvlTree;typedef int ElementType;struct AvlNode{ElementType Data;AvlTree Left;AvlTree Right;int Height;};AvlTree MakeEmpty(AvlTree T);Position Find(ElementType X, AvlTree T);Position FindMin(AvlTree T);Position FindMax(AvlTree T);AvlTree Insert(ElementType X, AvlTree* T);AvlTree Delete(ElementType X, AvlTree T);int Retrive(Position P);static int Height(Position P);static Position SingleRotateLeft(Position K2);static Position SingleRotateRight(Position K1);static Position DoubleRotateLeft(Position K3);static Position DoubleRotateRight(Position K3);int Max(int A, int B);void PostPrint(AvlTree T);int main(){int a[10] = { 10, -1, 22, 13, 5, -4, 23, 6, 14, 9 };AvlTree T = NULL;int i;for (i = 0; i < 10; i++){Insert(a[i], &T);}PostPrint(T);printf("\n");MakeEmpty(T);return 0;}AvlTree MakeEmpty(AvlTree T){if (T != NULL){MakeEmpty(T->Left);MakeEmpty(T->Right);free(T);}return NULL;}static int Height(Position P){if (P == NULL)return -1;elsereturn P->Height;}AvlTree Find(ElementType X, AvlTree T){if (T == NULL)return NULL;if (X < T->Data)return Find(X, T->Left);else if (X>T->Data)return Find(X, T->Right);elsereturn T;}AvlTree FindMin(AvlTree T){if (T == NULL)return NULL;else if (T->Left == NULL)return T;elsereturn FindMin(T->Left);}AvlTree FindMax(AvlTree T){if (T != NULL){while (T->Right != NULL)T = T->Right;}return T;}static Position SingleRotateLeft(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), K2->Height) + 1;return K1;}static Position SingleRotateRight(Position K1){Position K2;K2 = K1->Right;K1->Right = K1->Left;K2->Left = K1;K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1;K2->Height = Max(K1->Height, Height(K2->Right)) + 1;return K2;}static Position DoubleRotateLeft(Position K3){K3->Left = SingleRotateRight(K3->Left);return SingleRotateLeft(K3);}static Position DoubleRotateRight(Position K3){K3->Right = SingleRotateLeft(K3->Left);return SingleRotateRight(K3);}AvlTree Insert(ElementType X, AvlTree* T){if (*T == NULL){*T = (AvlTree) malloc(sizeof(struct AvlNode));if (*T == NULL)exit(1);else{(*T)->Data = X;(*T)->Height = 0;(*T)->Left = (*T)->Right = NULL;}}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 = SingleRotateLeft(*T);else*T = DoubleRotateLeft(*T);}}else if (X>(*T)->Data){(*T)->Right = Insert(X, &(*T)->Right);if (Height((*T)->Right) - Height((*T)->Left) == 2){if (X > (*T)->Right->Data)*T = SingleRotateRight(*T);else*T = DoubleRotateRight(*T);}}(*T)->Height = Max(Height((*T)->Left), Height((*T)->Right)) + 1;return *T;}int Max(int A, int B){return A > B ? A : B;}void PostPrint(AvlTree T){if (T == NULL)return;else{PostPrint(T->Left);printf("%d ", T->Data);PostPrint(T->Right);}}


1 0
原创粉丝点击