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;
}