这道题也没啥的,就是建一颗AVL树,只是Insert和旋转,连删除都没有设计,毕竟AVL树的删除比插入要复杂。
04-树5 Root of AVL Tree(25 分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
![](https://i-blog.csdnimg.cn/blog_migrate/53d1b25e001121fbce282e9810229ff3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/29ebcd752e71db8af7bf56e7f79a5592.png)
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the root of the resulting AVL tree in one line.
Sample Input 1:
5
88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88
//
// main.c
// AVL Tree
//
// Created by air on 2018/3/29.
// Copyright © 2018年 air. All rights reserved.
// 这道题目就是创建一棵AVL树
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct AvlNode* AvlTree;
typedef struct AvlNode* Position;
struct AvlNode{
ElementType value;
AvlTree left;
AvlTree right;
int height;
};
Position MakeNode(ElementType X);
AvlTree Insert(AvlTree T, ElementType X);
AvlTree SingleLeftRotation ( AvlTree T);
AvlTree SingleRightRotation ( AvlTree T);
AvlTree DoubleLeftRotation ( AvlTree T);
AvlTree DoubleRightRotation ( AvlTree T);
void FreeAvlTree(AvlTree T);
int getHeight(Position P);
int Max (int a, int b){
return a > b? a : b;
}
int main(int argc, const char * argv[]) {
int N, x;
scanf("%d",&N);
AvlTree T = NULL;
for (int i = 0; i < N; i++) {
scanf("%d", &x);
T = Insert(T, x);
}
if( T )
printf("%d",T->value);
FreeAvlTree(T);
return 0;
}
int getHeight(Position P){
if(P == NULL)
return -1;
else
return P->height;
}
AvlTree SingleLeftRotation ( AvlTree T ){
Position K1;
K1 = T->left;
T->left = K1->right;
K1->right = T;
T->height = Max(getHeight(T->left), getHeight(T->right)) + 1; /* T和K1的高度都不一样了 */
K1->height = Max(getHeight(K1->left), getHeight(K1->right)) + 1;
return K1;
}
AvlTree SingleRightRotation ( AvlTree T ){
Position K1;
K1 = T->right;
T->right = K1->left;
K1->left = T;
T->height = Max(getHeight(T->left), getHeight(T->right)) + 1; /* T和K1的高度都不一样了 */
K1->height = Max(getHeight(K1->left), getHeight(K1->right)) + 1;
return K1;
}
AvlTree DoubleLeftRotation ( AvlTree T){
T->left = SingleRightRotation(T->left);
return SingleLeftRotation(T);
}
AvlTree DoubleRightRotation ( AvlTree T){
T->right = SingleLeftRotation(T->right);
return SingleRightRotation(T);
}
AvlTree Insert(AvlTree T, ElementType X){
if( !T )
T = MakeNode(X);
/*如果T为空*/
else if( X > T->value){
T->right = Insert(T->right, X);
if(getHeight(T->right) - getHeight(T->left) == 2){
if(X > T->right->value)
T = SingleRightRotation(T);
else
T = DoubleRightRotation(T);
}
}
else if( X < T->value){
T->left = Insert(T->left, X);
if(getHeight(T->left) - getHeight(T->right) == 2){
if( X < T->left->value)
T = SingleLeftRotation(T);
else
T = DoubleLeftRotation(T);
}
}
T->height = Max(getHeight(T->left), getHeight(T->right)) + 1; /* 更新节点的高度 */
return T;
}
Position MakeNode( X ){
Position P = (Position)malloc(sizeof(struct AvlNode));
P->left = NULL;
P->right = NULL;
P->value = X;
P->height = 0;
return P;
}
void FreeAvlTree(AvlTree T){
if(T->left)
FreeAvlTree(T->left);
if(T->right)
FreeAvlTree(T->right);
free(T);
}