코드
#include<stdio.h>
#include<stdlib.h>
// AVL 트리 노드 정의
typedef struct AVLNode
{
int key;
struct AVLNode* left;
struct AVLNode* right;
} AVLNode;
int Max(int x, int y)
{
if (x >= y)
return x;
else return y;
}
// 트리의 높이를 반환
int getHeight(AVLNode* node)
{
int height = 0;
if (node != NULL)
height = 1 + Max(getHeight(node->left),
getHeight(node->right));
return height;
}
// 노드의 균형인수를 반환
int getBalance(AVLNode* node)
{
if (node == NULL) return 0;
return getHeight(node->left)
- getHeight(node->right);
}
// 노드를 동적으로 생성하는 함수
AVLNode* createNode(int key)
{
AVLNode* node = (AVLNode*)malloc(sizeof(AVLNode));
node->key = key;
node->left = NULL;
node->right = NULL;
return(node);
}
// 오른쪽으로 회전시키는 함수
AVLNode* rotateRight(AVLNode* parent)
{
AVLNode* child = parent->left;
parent->left = child->right;
child->right = parent;
// 새로운 루트를 반환
return child;
}
// 왼쪽으로 회전시키는 함수
AVLNode* rotateLeft(AVLNode* parent)
{
AVLNode* child = parent->right;
parent->right = child->left;
child->left = parent;
// 새로운 루트 반환
return child;
}
// AVL 트리에 새로운 노드 추가 함수
// 새로운 루트를 반환한다.
AVLNode* insert(AVLNode* node, int key)
{
// 이진 탐색 트리의 노드 추가 수행
if (node == NULL) // node가 비어있을 때
return(createNode(key));
if (key < node->key) // insert할 key값이 현재 노드보다 작을 때
node->left = insert(node->left, key);
else if (key > node->key)// insert할 key값이 현재 노드보다 클 때
node->right = insert(node->right, key);
else // 동일한 키는 허용되지 않음
return node;
// 노드들의 균형인수 재계산
int balance = getBalance(node);
// LL 타입 처리
if (balance > 1 && key < node->left->key)
return rotateRight(node);
// RR 타입 처리
if (balance < -1 && key > node->right->key)
return rotateLeft(node);
// LR 타입 처리
if (balance > 1 && key > node->left->key)
{
node->left = rotateLeft(node->left);
return rotateRight(node);
}
// RL 타입 처리
if (balance < -1 && key < node->right->key)
{
node->right = rotateRight(node->right);
return rotateLeft(node);
}
return node;
}
// 중위 순회 함수
void inorder(AVLNode* root)
{
if (root != NULL)
{
inorder(root->left);
printf("[%d] ,%d ", root->key, getBalance(root));
inorder(root->right);
}
}
//전위순회함수
void preorder(AVLNode* root)
{
if (root != NULL)
{
printf("[%d] ,%d ", root->key, getBalance(root));
preorder(root->left);
preorder(root->right);
}
}
int main(void)
{
AVLNode* root = NULL;
// 예제 트리 구축
root = insert(root, 10);
root = insert(root, 20);
root = insert(root, 30);
root = insert(root, 40);
root = insert(root, 50);
root = insert(root, 25);
root = insert(root, 27);
root = insert(root, 29);
printf("중위 순회 결과 \n");
inorder(root);
printf("\n\n");
printf("전위 순회 결과 \n");
preorder(root);
return 0;
}