MOOC数据结构 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.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
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
对AVLTree的理解:
1、定义:左右子树的高度差不超过1
2、旋转结点的选取:在每次旋转时主要抓取三个结点,①平衡被破坏的结点;②平衡破坏结点的下一个结点(根据破坏者的位置确定);③破坏结点(即使破坏结点没有与第二个结点直接相连,可以将包含破坏结点的②结点的一整棵子树看作一个结点);
3、LL旋转:将被破坏结点的left指向②结点的right,同时将②结点的right指向①;RR同理;
LR旋转:先从②结点开始,进行一次RR旋转(RR是将结点进行一次逆时针旋转)后,形式上就会变为LL,所以对被破坏结点使用一次LL旋转即可完成LR旋转;RL同理;
#include <stdio.h>
#include <stdlib.h>
typedef struct AVLTree {
int data;
struct AVLTree *left;
struct AVLTree *right;
int height;
} *AVLTree;
AVLTree Insert (AVLTree T, int data);//将数值插入树中
int Max (int a, int b);//寻找两数之间最大值
int GetHeight (AVLTree T);//寻找当前结点的高度
AVLTree SingleLeftRotation (AVLTree T);