1066. Root of AVL Tree (25)

来源:互联网 发布:淘宝联盟是骗局吗 编辑:程序博客网 时间:2024/06/16 20:35

1066. Root of AVL Tree (25)

 

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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:
588 70 61 96 120
Sample Output 1:
70
Sample Input 2:
788 70 61 96 120 90 65
Sample Output 2:
88

 

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct nodes{int  var;struct nodes* left;struct nodes* right;int hight;}NODE;int Max(int x, int y){if (x > y){return x;}return y;}int Hight(NODE* p){if (p == NULL){return -1;}else{return p->hight;}}NODE* SingleRotateRight(NODE* k2){NODE* k1;k1 = k2->right;k2->right = k1->left;k1->left = k2;k1->hight = Max(Hight(k1->left), Hight(k1->right)) + 1;k2->hight = Max(Hight(k2->left), Hight(k2->right)) + 1;return k1;}NODE* SingleRotateLeft(NODE* k2){NODE* k1;k1 = k2->left;k2->left = k1->right;k1->right = k2;k1->hight = Max(Hight(k1->left), Hight(k1->right)) + 1;k2->hight = Max(Hight(k2->left), Hight(k2->right)) + 1;return k1;}NODE* DoubleRotateLeft(NODE* k3){k3->left = SingleRotateRight(k3->left);return SingleRotateLeft(k3);}NODE* DoubleRotateRight(NODE* k3){k3->right = SingleRotateLeft(k3->right);return SingleRotateRight(k3);}NODE* Insert(NODE* T, int var){if (T == NULL){T = (NODE*)malloc(sizeof(NODE));T->var = var;T->left = NULL;T->right = NULL;T->hight = 0;}else if (var < T->var){T->left = Insert(T->left, var);if (Hight(T->left) - Hight(T->right) == 2){if (var < T->left->var){T = SingleRotateLeft(T);}else{T = DoubleRotateLeft(T);}}}else if (var > T->var){T->right = Insert(T->right, var);if (Hight(T->right) - Hight(T->left) == 2){if (var > T->right->var){T = SingleRotateRight(T);}else{T = DoubleRotateRight(T);}}}T->hight = Max(Hight(T->left), Hight(T->right)) + 1;return T;}int main(){int N, i, var;NODE* root;root = NULL;//freopen("d:\\input.txt", "r", stdin);scanf("%d", &N);for (i = 0; i < N; i++){scanf("%d", &var);root = Insert(root, var);}printf("%d\n", root->var);return 0;}


 

 

 

 

0 0
原创粉丝点击