04-树5 Root of AVL Tree

来源:互联网 发布:国网内网网络大学地址 编辑:程序博客网 时间:2024/06/12 01:23

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:

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<iostream>#include<fstream>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<iomanip>#include<stack>#include<queue>#include<string>#include<math.h>using namespace std;typedef struct AVLNode *AVLTree;typedef struct AVLNode {AVLTree left;AVLTree right;int data;int height;};AVLTree insert(AVLTree t, int x);AVLTree leftrot(AVLTree t);AVLTree rightrot(AVLTree t);AVLTree leftrightrot(AVLTree t);AVLTree rightleftrot(AVLTree t);int getHeight(AVLTree t) {if (!t) return 0;return t->height;}AVLTree leftrot(AVLTree t) {AVLTree b = t->left;t->left = b->right;b->right = t;t->height = max(getHeight(t->left), getHeight(t->right)) + 1;b->height = max(getHeight(b->left), getHeight(t)) + 1;return b;}AVLTree rightrot(AVLTree t) {AVLTree b = t->right;t->right = b->left;b->left = t;t->height = max(getHeight(t->left), getHeight(t->right)) + 1;b->height = max(getHeight(b->right), getHeight(t)) + 1;return b;}AVLTree leftrightrot(AVLTree t) {t->left = rightrot(t->left);return leftrot(t);}AVLTree rightleftrot(AVLTree t) {t->right = leftrot(t->right);return rightrot(t);}AVLTree insert(AVLTree t, int x) {if (!t) {t = (AVLTree)malloc(sizeof(struct AVLNode));t->data = x;t->height = 0;//如果插入点为空,那么插入,自然高度也就是0了t->left = NULL;t->right = NULL;}else {if (x < t->data) {t->left = insert(t->left,x);if (getHeight(t->left) == getHeight(t->right) + 2) {if (x < t->left->data) {t = leftrot(t);}else  {t = leftrightrot(t);}}}else {t->right = insert(t->right,x);if (getHeight(t->right) == getHeight(t->left) + 2) {if (x > t->right->data) {t = rightrot(t);}elset = rightleftrot(t);}}}t->height = max(getHeight(t->left), getHeight(t->right)) + 1;return t;}int main() {//ifstream cin("input.txt");int n;cin >> n;AVLTree t;t = NULL;//第一次从空树开始插入while (n--) {int temp;cin >> temp;t = insert(t, temp);}cout << t->data;return 0;}



0 0
原创粉丝点击