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 ythe root of the resulting AVL tree in one line.
Sample Input 1:5 88 70 61 96 120Sample Output 1:
70Sample Input 2:
7 88 70 61 96 120 90 65Sample Output 2:
88
题目意思:给出节点求avl树的根结点。数据结构与算法分析-c语言描述书上有分析和源码
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct avlNode *avlTree;
struct avlNode
{
int node;
avlTree left;
avlTree right;
int height;
};
int Height(avlTree p)
{//空树的高度为-1
if(p == NULL)
return -1;
else
return p->height;
}
avlTree rotateRight(avlTree root)
{//全部在左边,往右旋转
avlNode* leftTree;
leftTree = root->left;
root->left = leftTree->right;
leftTree->right = root;
root->height = max(Height(root->left), Height(root->right)) + 1;
leftTree->height = max(Height(leftTree->left), root->height) + 1;
return leftTree;
}
avlTree rotateLeft(avlTree root)
{
avlNode* rightTree;
rightTree = root->right;
root->right = rightTree->left;
rightTree->left = root;
root->height = max(Height(root->left), Height(root->right)) + 1;
rightTree->height = max(Height(rightTree->left), root->height) + 1;
return rightTree;
}
avlTree rotateLeftRight(avlTree root)
{
root->left = rotateLeft(root->left);
return rotateRight(root);
}
avlTree rotateRightLeft(avlTree root)
{
root->right = rotateRight(root->right);
return rotateLeft(root);
}
avlTree insert(int node, avlTree T)
{
if(T == NULL){
T = new avlNode();
if(T == NULL)
printf("out of space!!!");
else {
T->node = node;
T->left = NULL;
T->right = NULL;
T->height = 0;
}
} else if(node < T->node){
T->left = insert(node, T->left);
if(Height(T->left) - Height(T->right) == 2){
if(node < T->left->node)//全部都往左插,进行一次往右的单旋转即可
T = rotateRight(T);
else//一次往左插入,一次往右插入,先进行一次往左的单旋转,一次往右的单旋转
T = rotateLeftRight(T);
}
}else if(node > T->node){
T->right = insert(node, T->right);
if(Height(T->right) - Height(T->left) == 2){
if(node > T->right->node)//全部都往右边插,进行一次往左的单旋转
T = rotateLeft(T);
else//一次往右插入,一次往左插入,先进行一次往右的单旋转,再进行一次往左的单旋转
T = rotateRightLeft(T);
}
}
T->height = max(Height(T->left), Height(T->right)) + 1;
return T;
}
int main()
{
int n, node;
scanf("%d", &n);
avlTree root = NULL;
for(int i = 0; i < n; i++){
scanf("%d", &node);
root = insert(node, root);
}
printf("%d", root->node);
return 0;
}