调试后感觉是getheight那里有问题?好像每次进入都给height赋值为-1
#include <stdio.h>
#include <stdlib.h>
struct AVLNode;
typedef struct AVLNode* AVLT;
typedef struct AVLNode* AVLPosition;
typedef int ElementType;
int GetHeight(AVLPosition P);
int Max0(int a, int b);
AVLT LeftRotation(AVLT T);
AVLT RightRotation(AVLT T);
AVLT LeftRightRotation(AVLT T);
AVLT RightLeftRotation(AVLT T);
AVLT AVLInsert(AVLT T, ElementType X);
void PrintAVL(AVLT T);
struct AVLNode {
ElementType Data;
int height;
AVLPosition Left;
AVLPosition Right;
};
#include "AVL.h"
int GetHeight(AVLPosition P) {
if (P == NULL)
return -1;
else
return P->height;
}
int Max0(int a, int b) {
return a > b ? a : b;
}
AVLT LeftRotation(AVLT T) {
AVLPosition B = T->Left;
T->Left = B->Right;
B->Right = T;
T->height = Max0(GetHeight(T->Left), GetHeight(T->Right) + 1);
B->height = Max0(GetHeight(B->Left), T->height) + 1;
return B;
}
AVLT RightRotation(AVLT T) {
AVLPosition B = T->Right;
T->Right = B->Left;
B->Left = T;
T->height = Max0(GetHeight(T->Left), GetHeight(T->Right)) + 1;
B->height = Max0(GetHeight(B->Right), T->height) + 1;
return B;
}
AVLT LeftRightRotation(AVLT T) {
AVLPosition B = T->Left;
B = RightRotation(B);
return LeftRotation(T);
}
AVLT RightLeftRotation(AVLT T) {
AVLPosition B = T->Right;
B = LeftRotation(B);
return RightRotation(T);
}
AVLT AVLInsert(AVLT T, ElementType X) {
if (!T)
{
T = (AVLT)malloc(sizeof(struct AVLNode));
T->Left = T->Right = NULL;
T->Data = X;
T->height = 0;
}
else if (X < T->Data)
{
T->Left = AVLInsert(T->Left, X);
if ((T->Left->height - T->Right->height) == 2)
{
if (X < T->Left->Data)
T = LeftRotation(T);
else
T = LeftRightRotation(T);
}
}
else if (X > T->Data)
{
T->Right = AVLInsert(T->Right, X);
if (GetHeight(T->Right) - GetHeight(T->Left) == 2)
{
if (X > T->Right->Data)
T = RightRotation(T);
else
T = RightLeftRotation(T);
}
}
else //X = T->Data
;
T->height = Max0(GetHeight(T->Left), GetHeight(T->Right)) + 1; //从叶子(已由旋转函数进行更新)到根部,必须更新每个节点的height
return T;
}
void PrintAVL(AVLT T) {
if (!T)
return;
else
{
printf("%d\n", T->Data);
PrintAVL(T->Left);
PrintAVL(T->Right);
}
}
#include "AVL.h"
int main() {
AVLT T = malloc(sizeof(struct AVLNode));
T->Data = 7;
T->Left = T->Right = NULL;
AVLInsert(T, 8);
AVLInsert(T, 9);
PrintAVL(T);
return 0;
}