04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25)

时间限制

100 ms

内存限制

65536 kB

代码长度限制

8000 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:

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>
struct Node {
	int val;
	int height;
	struct Node *left;
	struct Node *right;
};
int max(int a, int b) {				//返回两者较大者
	return a > b ? a : b;
}
int height(struct Node* root) {		//为了兼容空树,树高度不能直接返回根节点的height属性
	if (root == NULL) {
		return -1;
	}
	else {
		return root->height;
	}
}
struct Node* RRrotation(struct Node* k1) {		//右右旋转
	struct Node* k2 = k1->right;		//k2为根节点k1的右儿子
	k1->right = k2->left;				//将k2的左儿子连接到k1的右子节点
	k2->left = k1;						//将k1连接到k2的左子节点
	k1->height = max(height(k1->left), height(k1->right)) + 1;	//更新节点高度,只有k1,k2节点高度变化
	k2->height = max(height(k2->left), height(k2->right)) + 1;
	return k2;
}
struct Node* LLrotation(struct Node* k1) {		//左左旋转
	struct Node* k2 = k1->left;
	k1->left = k2->right;
	k2->right = k1;
	k1->height = max(height(k1->left), height(k1->right)) + 1;
	k2->height = max(height(k2->left), height(k2->right)) + 1;
	return k2;
}
struct Node* RLrotation(struct Node* k1) {		//右左旋转
	//分两步:先对根节点的右子树做左左旋转,再对根做右右旋转
	k1->right = LLrotation(k1->right);
	return RRrotation(k1);
}
struct Node* LRrotation(struct Node* k1) {		//左右旋转
	k1->left = RRrotation(k1->left);
	return LLrotation(k1);
}
struct Node* insertAvlTree(struct Node* node, struct Node* root) {
	if (root == NULL) {
		root = node;
		return root;
	}
	if (node->val > root->val) {
		root->right = insertAvlTree(node, root->right);		//插入右子树
		if (height(root->right) - height(root->left) == 2) {
			if (node->val > root->right->val) {				//如果插入右子树的右子树,进行右右旋转
				root = RRrotation(root);
			}
			else if (node->val < root->right->val) {		//进行右左旋转
				root = RLrotation(root);
			}
		}
	}
	else if (node->val < root->val) {		//插入左子树情况与上面类似
		root->left = insertAvlTree(node, root->left);
		if (height(root->left) - height(root->right) == 2) {
			if (node->val < root->left->val) {
				root = LLrotation(root);
			}
			else if(node->val > root->left->val) {
				root = LRrotation(root);
			}
		}
	}
	//递归中不断更新插入节点到根节点路径上所有节点的高度
	root->height = max(height(root->left), height(root->right)) + 1;
	return root;
}
int main() {
	freopen("test.txt", "r", stdin);
	int n;
	scanf("%d", &n);
	struct Node nodes[20];
	struct Node *root = NULL;
	for (int i = 0; i < n; ++i) {		//初始化一个节点,并插入AVL树中
		scanf("%d", &nodes[i].val);
		nodes[i].height = 0;			//孤立的节点高度为0
		nodes[i].left = NULL;
		nodes[i].right = NULL;
		root = insertAvlTree(&nodes[i], root);
	}
	printf("%d", root->val);
	return 0;
}

题目链接:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%914

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 02:42:48

04-树4. Root of AVL Tree (25)的相关文章

1066. Root of AVL Tree (25)【AVL树】——PAT (Advanced Level) Practise

题目信息 1066. Root of AVL Tree (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B 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 tha

04-1. Root of AVL Tree (25)

04-1. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 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

pat04-树4. Root of AVL Tree (25)

04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 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 tim

pat1066. Root of AVL Tree (25)

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 tim

PAT 甲级 1066 Root of AVL Tree (25 分)(快速掌握平衡二叉树的旋转,内含代码和注解)***

1066 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

A1066. 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 illust

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 o

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 illust

A1066 Root of AVL Tree (25分)

一.技术总结 这是一个平衡二叉树AVL树,就是一个二叉查找树,但是平衡因子不能够超过1. 这个树的数据结构比一般的要多一个height的参数,用于计算平衡因子,就是用当前结点的左子树的height减去右子树的height. 对于node* newNode(int data)函数,首先要新建一个结点,然后初始化height参数为1,然后左右子树结点赋值为NULL. getHeight()函数和updateHeight()函数,后者就是根据当前结点的左右子树结点高度的最大值,然后加一. getBF(