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 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 分)(快速掌握平衡二叉树的旋转,内含代码和注解)***的更多相关文章
- pat 甲级 1066. 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分)
PAT甲级:1066 Root of AVL Tree (25分) 题干 An AVL tree is a self-balancing binary search tree. In an AVL t ...
- PAT甲级1066. Root of AVL Tree
PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...
- PAT 甲级 1066 Root of AVL Tree
https://pintia.cn/problem-sets/994805342720868352/problems/994805404939173888 An AVL tree is a self- ...
- 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 ...
- 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甲级】1066 Root of AVL Tree (25 分)(AVL树建树模板)
题意: 输入一个正整数N(<=20),接着输入N个结点的值,依次插入一颗AVL树,输出最终根结点的值. AAAAAccepted code: #define HAVE_STRUCT_TIMESP ...
- 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)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
随机推荐
- python 中 super函数的使用
转载地址:http://python.jobbole.com/86787/ 1.简单的使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我 ...
- if __name__ == "__main__",python主程序入口
https://blog.csdn.net/liukai2918/article/details/79465671
- java集合Map
参考文章:https://blog.csdn.net/yjn1995/article/details/89784891 1.map接口 1.map接口实现类,HashMap.LinkListMap.H ...
- SSM整合Dubbo登陆案例
登陆案例 一.创建Service项目存放共同数据 1.1 创建实体类 private long id; private String loginName; private String userNa ...
- 【爬虫】大杀器——phantomJS+selenium
[爬虫]大杀器——phantomJS+selenium 视频地址 江湖上有一个传说,得倚天屠龙者可称霸武林.爬虫中也有两个大杀器,他们结合在一起时,无往不利,不管你静态网站还是动态网站,通吃. pha ...
- 洛谷 4290 [HAOI2008]玩具取名 题解
P4290 [HAOI2008]玩具取名 题目描述 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用&qu ...
- python-图像目标监测(1)识别答题卡
# -*- coding: utf-8 -*- """ Created on Thu Dec 20 16:05:10 2018 @author: leizhen.liu ...
- (1)前端框架uni-app
前端框架uni-app 可编译到iOS.Android.H5.小程序等多个平台 一套代码编到7个平台 uni-app在跨端数量.扩展能力.性能体验.周边生态.学习成本.开发成本等6大关键指标上拥有极强 ...
- Linux下多线程模拟停车场停车
#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> # ...
- 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...