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 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 (≤) which is the total number of keys to be inserted. Then Ndistinct 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

题意:

将输入调整为平衡二叉树(AVL),输出根结点元素

题解:

判断插入结点对现有结点的平衡因子的影响,进而进行LL,LR,RL,RR旋转
假设三个结点连接关系为A->B->C,C为新插入结点并使得A的平衡因子==2
若C在A的左孩子的左子树上,则对A与B进行LL旋转
若C在A的左孩子的右子树上,则对A,B,C进行LR旋转,可分解为首先对B与C进行RR旋转,再对A与C进行LL旋转
若C在A的右孩子的右子树上,则对A与B进行RR旋转
若C在A的右孩子的左子树上,则对A,B,C进行RL旋转,可分解为首先对B与C进行LL旋转,再对A与C进行RR旋转

平衡二叉树选择详解:

4种平衡调整如下(结点的数字仅作标记作用):

(图中数字仅用于区分节点的不同,不用来表示节点的数值大小)

①LL:

对于根节点:左边比右边多

对于左节点:左边比右边多

右单旋转

  

②RR:

对于根节点:边比左边多

对于节点:边比边多

左单旋转

  

③LR平衡旋转:

对于根节点:左边比右边多

对于节点:右边比左边多

先左后右(先处理节点,再处理节点)

  

④RL平衡旋转:

对于根节点:右边比左边多

对于右节点:左边比右边多

先右后左(先处理右节点,再处理节点)

  

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct node{
int data;
node *lchild,*rchild;
};
node *Newnode(int x){//新建一个结点
node* newnode=new node;
newnode->data=x;
newnode->lchild=newnode->rchild=NULL;
return newnode;
}
int Height(node* root){//返回高度
if(root==NULL) return ;
else return max(Height(root->lchild),Height(root->rchild))+;
}
int getbalance(node* root){//检查是否平衡
return Height(root->lchild)-Height(root->rchild);
}
void R(node*&root){//右旋
//左节点成为根节点
node* temp=root->lchild;
root->lchild=root->rchild;//根的左边换成了左节点的右节点
temp->rchild=root;//根自己成为了原来左节点的右节点
root=temp;
}
void L(node*&root){//左旋
//右节点成为根节点
node *temp=root->rchild;
root->rchild=temp->lchild;//根的右边换成了右节点的左节点
temp->lchild=root;//根自己成为了原来右节点的左节点
root=temp;
}
void insert(node*&root,int x){
if(root==NULL){
root=Newnode(x);
return;
}
if(x<root->data){
insert(root->lchild,x);
if(getbalance(root)==){//左边必比右边高2
if(getbalance(root->lchild)==){//左节点的左边比右边高1
R(root);//右单旋
}else if(getbalance(root->lchild)==-){//左节点的右边比左边高1
L(root->lchild);//对于左节点左旋
R(root);//再跟节点右旋
}
}
}else{
insert(root->rchild,x);
if(getbalance(root)==-){//右边必比左边高2
if(getbalance(root->rchild)==){//右节点的左边比右边高1
R(root->rchild);//对于右节点右旋
L(root);//再跟节点左旋
}else if(getbalance(root->rchild)==-){//右节点的右边比左边高1
L(root);//左单旋
}
}
}
}
int main(){
scanf("%d",&n);
node *root = NULL;
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
insert(root,x);
}
printf("%d",root->data);//输出处理好的平衡二叉树的根节点
return ;
}

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

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

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

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

  3. PAT甲级1066. Root of AVL Tree

    PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...

  4. PAT 甲级 1066 Root of AVL Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805404939173888 An AVL tree is a self- ...

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

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

  7. 【PAT甲级】1066 Root of AVL Tree (25 分)(AVL树建树模板)

    题意: 输入一个正整数N(<=20),接着输入N个结点的值,依次插入一颗AVL树,输出最终根结点的值. AAAAAccepted code: #define HAVE_STRUCT_TIMESP ...

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

  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. nodejs查看本机hosts文件域名对应ip

    const dns = require('dns') dns.lookup('domainName', function(err, result) { console.log(result) }) r ...

  2. [LuoguP1462]通往奥格瑞玛的道路

    题目链接 题意简述:现在有一个图,每经过一个点就会交钱,走一条路就会扣血.在血量>0的前提下,要从1走到n点,并且要求路径上交钱的最大值最小. 解题思路:首先最大值最小,我们选择二分.目前有两个 ...

  3. 第一章 -- MySQL简介及安装

    什么是数据库 数据库实际上就是一个文件集合,是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作 数据库管理系统(DBMS) RDBM ...

  4. C# 函数参数中的this

    先看下面的代码: public static class StringExtension { public static void Foo(this string s) { Console.Write ...

  5. Sqoop 安装与简单测试

    sqoop基于Hadoop与Hive Hadoop https://www.cnblogs.com/xibuhaohao/p/11772031.html Hive      https://www.c ...

  6. YAML_06 playbook从上往下顺序执行,若报错,不提示,继续往下执行

    ansible]# vim user4.yml --- - hosts: cache   remote_user: root   vars:     user: bb   tasks:    - sh ...

  7. JSP简单标签的开发

    1. 新建RepeatSampleTag类,代码如下: package bid.zhazhapan.fims.tag; import java.io.IOException; import java. ...

  8. Codeforces Round #576 (div.1 + div.2)

    Div2 A 长度为\(n(n≤10^5)\)的数组,每个元素不同,求有多少个位置\(d\)满足\(d - x \le j < d \And d < j \le d + y a_d< ...

  9. LayuiAdmin 单页版关闭当前页面tab的方式-图文

    需要关闭的时候 调用 parent.layui.admin.events.closeThisTabs() 即可执行当前页面的关闭 $.post("/index.php/WebAdmin/Wx ...

  10. mapreduce入门程序之---wordcount

    mapreduce是hadoop生态中非常重要的一部分,顾名思义,主要分为两部分,map和reduce,他们各司其职,map的主要功能是用来对待处理的文档进行处理,主要是对数据进行按行读取,分割,然后 ...