## PAT真题练习(甲级)1066 Root of AVL Tree (25 分)(平衡二叉树)

PAT真题练习(甲级)1066 Root of AVL Tree (25 分)

原题网址: https://pintia.cn/problem-sets/994805342720868352/problems/994805404939173888

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

AC代码

#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

//定义节点类型
struct Node {
	Node* left = nullptr;
	Node* right = nullptr;
	int value;
	int rsize = 0;
	int lsize = 0;
};

// 左旋操作
Node* L(Node * root) {
	auto tmp = root->right;
	root->right = tmp->left;
	tmp->left = root;
	if (root->right == nullptr) root->rsize = 0;
	else root->rsize = max(root->right->lsize, root->right->rsize) + 1;
	if (tmp->left == nullptr) tmp->lsize = 0;
	else tmp->lsize = max(tmp->left->lsize, tmp->left->rsize) + 1;
	return tmp;
}

//右旋操作
Node* R(Node * root) {
	auto tmp = root->left;
	root->left = tmp->right;
	tmp->right = root;
	if (root->left == nullptr) root->lsize = 0;
	else root->lsize = max(root->left->lsize, root->left->rsize) + 1;
	if (tmp->right == nullptr) tmp->rsize = 0;
	else tmp->rsize = max(tmp->right->lsize, tmp->right->rsize) + 1;
	return tmp;
}

//插入操作
Node* insert(Node* parent, int value) {
	Node* tmp = parent;
	if (parent == nullptr) {
		tmp = new Node();
		tmp->value = value;
		return tmp;
	}
	// 根据大小判断插入位置(注意更新rsize和lsize)
	else if (parent->value < value) {
		parent->right = insert(parent->right, value);
		parent->rsize = max(parent->right->rsize, parent->right->lsize) + 1;
	}
	else {
		parent->left = insert(parent->left, value);
		parent->lsize = max(parent->left->rsize, parent->left->lsize) + 1;
	}
	// 判断是否符合平衡二叉树要求
	if (abs(parent->rsize - parent->lsize) > 1) {
		// 分四种情况实现
		if (parent->rsize > parent->lsize) {
			if (parent->right->rsize < parent->right->lsize) parent->right = R(parent->right);
			parent = L(parent);
		}
		else {
			if (parent->left->rsize > parent->left->lsize) parent->left = L(parent->left);
			parent = R(parent);
		}
	}
	return parent;
}

int main() {
	int N;
	cin >> N;
	Node* root = nullptr;
	int tmp;
	for (auto i = 0; i < N;i++) {
		cin >> tmp;
		root = insert(root, tmp);
	}
	cout << root->value;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值