04-树5 Root of AVL Tree

14 篇文章 0 订阅

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


#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);
				}
				else
					t = 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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值