```C++ #pragma clang diagnostic push #pragma ide diagnostic ignored "misc-no-recursion" #include #include typedef int ElementType; struct AVLNode { ElementType Data; int Height; struct AVLNode *Left; struct AVLNode *Right; }; void Visit(struct AVLNode *T) { printf("%d ", T->Data); } void PreOrder(struct AVLNode *T) { if (T != NULL) { Visit(T); PreOrder(T->Left); PreOrder(T->Right); } } void PrintPreOrder(struct AVLNode *T) { printf("PreOrder: "); PreOrder(T); printf("\n"); } void InOrder(struct AVLNode *T) { if (T != NULL) { InOrder(T->Left); Visit(T); InOrder(T->Right); } } void PrintInOrder(struct AVLNode *T) { printf("InOrder: "); InOrder(T); printf("\n"); } void PostOrder(struct AVLNode *T) { if (T != NULL) { PostOrder(T->Left); PostOrder(T->Right); Visit(T); } } void PrintPostOrder(struct AVLNode *T) { printf("PostOrder: "); PostOrder(T); printf("\n"); } int GetHeight(struct AVLNode *T) { if (T == NULL) { return 0; } return T->Height; } int Max(int a, int b) { return a > b ? a : b; } struct AVLNode *SingleLeftRotation(struct AVLNode *K2) { struct AVLNode *K1; K1 = K2->Left; K2->Left = K1->Right; K1->Right = K2; //旋转完后更新K1,K2的高度 K2->Height = Max(GetHeight(K2->Left), GetHeight(K2->Right)) + 1; K1->Height = Max(GetHeight(K1->Left), K2->Height) + 1; return K1; } struct AVLNode *SingleRightRotation(struct AVLNode *K1) { struct AVLNode *K2; K2 = K1->Right; K1->Right = K2->Left; K2->Left = K1; //旋转完后更新K1,K2的高度 K1->Height = Max(GetHeight(K1->Left), GetHeight(K1->Right)) + 1; K2->Height = Max(GetHeight(K2->Right), K1->Height) + 1; return K2; } struct AVLNode *DoubleLeftRotation(struct AVLNode *K2) { K2->Left = SingleRightRotation(K2->Left); return SingleLeftRotation(K2); } struct AVLNode *DoubleRightRotation(struct AVLNode *K1) { K1->Right = SingleLeftRotation(K1->Right); return SingleLeftRotation(K1); } struct AVLNode *InsertAVL(struct AVLNode *T, ElementType X) { if (T == NULL) { T = malloc(sizeof(struct AVLNode)); T->Data = X; T->Height = 1; T->Left = T->Right = NULL; } else if (X < T->Data) { T->Left = InsertAVL(T->Left, X); if (GetHeight(T->Left) - GetHeight(T->Right) == 2) { if (X < T->Left->Data) { T = SingleLeftRotation(T); } else { T = DoubleLeftRotation(T); } } } else if (X > T->Data) { T->Right = InsertAVL(T->Right, X); if (GetHeight(T->Right) - GetHeight(T->Left) == 2) { if (X > T->Right->Data) { T = SingleRightRotation(T); } else { T = DoubleRightRotation(T); } } } //else (X==T->Data) {不做任何事} T->Height = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1; return T; } int main() { struct AVLNode *T = NULL; for (int i = 0; i < 10; ++i) { T = InsertAVL(T, i); } PrintPreOrder(T); PrintInOrder(T); PrintPostOrder(T); free(T); return 0; } #pragma clang diagnostic pop ```