AVL平衡树

来源:互联网 发布:java药品管理系统 编辑:程序博客网 时间:2024/05/22 13:31
#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct treeItem {ElementType e;struct treeItem *left;struct treeItem *right;} TreeItem;typedef TreeItem *Tree;#define MAX(a, b) ((a) > (b) ? (a) : (b))TreeItem *Find(Tree t, ElementType e){while (t != NULL && e != t->e) {if (e < t->e)t = t->left;else/* if (e > t->e) */t = t->right;}return t;}TreeItem *FindMin(Tree t){while (t && t->left) {t = t->left;}return t;}TreeItem *FindMax(Tree t){while (t && t->right) {t = t->right;}return t;}TreeItem *SingleRotateWithLeft(TreeItem *p1){TreeItem *p2;p2 = p1->left;p1->left = p2->right;p2->right = p1;return p2;}TreeItem *SingleRotateWithRight(TreeItem *p1){TreeItem *p2;p2 = p1->right;p1->right = p2->left;p2->left = p1;return p2;}TreeItem *DoubleRotateWithLeft(TreeItem *p1){// Rotate between p2 and p3// p1->left = SingleRotateWithRight(p1->left);// // Rotate between p1 and p2 // return SingleRotateWithLeft(p1);TreeItem *p2 = p1->left;TreeItem *p3 = p2->right;p2->right = p3->left; // Rp3->left = p2;p1->left = p3;p1->left = p3->right; // Lp3->right = p1;return p3;}TreeItem *DoubleRotateWithRight(TreeItem *p1){p1->right = SingleRotateWithLeft(p1->right);return SingleRotateWithRight(p1);}Tree AVLInsert(Tree t, ElementType e){if (t == NULL) {t = (TreeItem *)malloc(sizeof(treeItem));if (!t) {printf("malloc error!\n");return NULL;}t->e = e;t->left = t->right = NULL;} else if (e < t->e) {t->left = AVLInsert(t->left, e);if ((GetHeight(t->left) - GetHeight(t->right)) == 2) {if (e < t->left->e)  // LLt = SingleRotateWithLeft(t);elset = DoubleRotateWithLeft(t); // LR}} else { // e >= t->et->right = AVLInsert(t->right, e);if ((GetHeight(t->right) - GetHeight(t->left)) == 2) {if (e > t->right->e) // RRt = SingleRotateWithRight(t);elset = DoubleRotateWithRight(t); // RL}}return t;}Tree AVLDelete(Tree t, ElementType e){if (!t) {printf("t is empty!\n");} else if (e < t->e) {t->left = AVLDelete(t->left, e);if (GetHeight(t->right) - GetHeight((t->left)) == 2) {TreeItem *p = t->right;if (GetHeight(p->left) > GetHeight(p->right))t = DoubleRotateWithRight(t);elset = SingleRotateWithRight(t);  }} else if (e > t->e) {t->right = AVLDelete(t->right, e);if (GetHeight(t->left) - GetHeight((t->right)) == 2) {TreeItem *p = t->left;if (GetHeight(p->right) > GetHeight(p->left))t = DoubleRotateWithLeft(t);elset = SingleRotateWithLeft(t);}} else { // e = t->e // fount itif (t->left && t->right) { // 有两个孩子的情况if (GetHeight(t->left) > GetHeight(t->right)) {  // 这里处理是关键t->e = FindMax(t->left)->e;t->left = AVLDelete(t->left, t->e);} else {t->e = FindMin(t->right)->e;t->right = AVLDelete(t->right, t->e);}} else { // 只有一个孩子or没有孩子TreeItem *pe = t;t = t->left ? t->left : t->right;free(pe);}}return t;}#define BUFSIZE 10int main(){ int arr[BUFSIZE] = {19, 13, 23, 8, 17, 21, 43, 3, 11, 14};Tree t = NULL;printf("insert element:\n");for (int i = 0; i < BUFSIZE; i++) {t = AVLInsert(t, arr[i]);printf("height:%d\n", GetHeight(t));InorderTraversal1(t); printf("\n");}printf("delete element:\n");for (int i = 0; i < BUFSIZE; i++) {t = AVLDelete(t, arr[i]);printf("height:%d\n", GetHeight(t));InorderTraversal(t);printf("\n");}getchar();return 0;}

0 0
原创粉丝点击