04-树4. Root of AVL Tree (25)
04-树4. 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 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
04-树4. Root of AVL Tree (25)的更多相关文章
- pat04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- pat 甲级 1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- PTA 04-树5 Root of AVL Tree (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/668 5-6 Root of AVL Tree (25分) An AVL tree ...
- PAT甲级:1066 Root of AVL Tree (25分)
PAT甲级:1066 Root of AVL Tree (25分) 题干 An AVL tree is a self-balancing binary search tree. In an AVL t ...
- pat1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- 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, t ...
- 1066 Root of AVL Tree (25分)(AVL树的实现)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- PAT Advanced 1066 Root of AVL Tree (25) [平衡⼆叉树(AVL树)]
题目 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child ...
- PAT 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 sub ...
随机推荐
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- 【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D
失踪人口突然回归……orz.题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂. 题目链接:http://codeforces.com/contest/992/problem/D 题目 ...
- Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- 简述HttpSession的作用、使用方法,可用代码说明
HttpSession中可以跟踪并储存用户信息,把值设置到属性中,有2个方法:setAttribute(),getAttrribute(): 例如:在一个方法中用session.setAttribut ...
- 搭建samba 共享openstack开发环境
centos7.2 openstack环境为allinone 模式,这样跑代码好处理 安装smb [root@controller ~]# yum install -y samba samba-cli ...
- luogu P4137 mex
题面: 有一个长度为$n$的数组${a1,a2,…,an}$.$m$次询问,每次询问一个区间内最小没有出现过的自然数. 令$lst[i][r]$表示在$[1, r]$中数值$i$最后出现的位置 那么, ...
- ZOJ 3213 Beautiful Meadow 简单路径 插头DP
简单路径的题目,其实就是在状态后面多记了有多少个独立插头. 分类讨论独立插头: 1.只存在上插头或者左插头,可以选择作为独立插头. 2.都不存在上插头和左插头,选择作为独立插头的同时要标号为新的连通块 ...
- noip200706字符串的展开
试题描述: 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获 ...
- sqlserver -- 学习笔记(二)“SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问”解决方法
将数据表导出到excel时出现下面错误: SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而 ...
- hihocoder1320 160周 压缩字符串
hihocoder1320 题目链接 思路: dp解法.用map[i][j]表示从第i个开始到第j个的字串的best压缩长度.(包括i,j,两端闭合). 用k表示i,j中的一点. 用zip()表示压缩 ...