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

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

  1. 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 ...

  2. pat 甲级 1066. Root of AVL Tree (25)

    1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  3. 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 ...

  4. 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 ...

  5. pat1066. Root of AVL Tree (25)

    1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  6. 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 ...

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

  8. 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 ...

  9. 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 ...

随机推荐

  1. Coding.net进阶,使用Git管理代码

    原文来自:http://conw.net/archives/18/ (我自己的博客,点击链接查看文章最新版本) Git是目前最流行的版本控制系统,这里以GitHub为例,介绍git的基本使用. Git ...

  2. Python并发编程-线程锁

    互斥锁-Lock #多线程中虽然有GIL,但是还是有可能产生数据不安全,故还需加锁 from threading import Lock, Thread #互斥锁 import time def ea ...

  3. HTML框架与表单

    1.框架处理结构 <html> <head> <meta http-equiv="Content-Type" content="text/h ...

  4. JavaScript三种数据类型之间的互转

    一:number<===>string  数字类型和字符串类型之间的互相转换 number===>string 数字转字符串有三种方式: 1.在数字后面 +“ ”; 2.利用字符串的 ...

  5. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  6. JZYZOJ1622 [usaco2009]工作安排 贪心

    和p1123智力大冲浪一样,可以用优先队列写...   每一秒可以做一个工作....因为n个任务只要在限制之前完成就行,所以时间不冲突的话肯定越早做完越好..所以最多的时间是n,当然限定的完成时间中最 ...

  7. django自定义分页控件

    1.准备数据 在models创建测试表 from django.db import models class Host(models.Model): hostname = models.CharFie ...

  8. Java并发(二):Java内存模型

    一.硬件内存架构 一个现代计算机通常由两个或者多个CPU.其中一些CPU还有多核.每个CPU在某一时刻运行一个线程是没有问题的.如果你的Java程序是多线程的,在你的Java程序中每个CPU上一个线程 ...

  9. ACM -- 算法小结(八)字符串算法之Manacher算法

    字符串算法 -- Manacher算法 首先介绍基础入门知识,以下这部分来着一贴吧,由于是很久之前看的,最近才整理一下,发现没有保存链接,请原创楼主见谅. //首先:大家都知道什么叫回文串吧,这个算法 ...

  10. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力

    C. Bear and Up-Down 题目连接: http://www.codeforces.com/contest/653/problem/C Description The life goes ...