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 ...
随机推荐
- Visual Studio 2017 许可证已过期解决方案
1.卸载并重安VS2017 2.安装后打开VS2017,点击帮助=>注册产品,输入序列号NJVYC-BMHX2-G77MM-4XJMR-6Q8QF(企业版), KBJFW-NXHK6-W4WJM ...
- SPA项目开发动态树、数据表格、分页功能
SPA项目开发 1.修改左侧动态树 LeftNav.vue <template> <el-menu router :" class="el-menu-vertic ...
- Node.js创建服务及实现静态资源托管/接口请求
1.环境 采用12.13.x版本 2.创建server.js 文件内容如下: let http = require("http"); let fs = require(" ...
- 代码格式化工具---indent工具
indent工具,可以把代码格式化成某种风格. 通过命令:rpm -qa | grep indent 查看是否安装了indent工具. 若没有,可使用命令sudo apt-get install ...
- BZOJ 1857: [Scoi2010]传送带
二次联通门 : BZOJ 1857: [Scoi2010]传送带 /* BZOJ 1857: [Scoi2010]传送带 三分套三分 可能是吧..dalao们都说明显是一个单峰函数 可是我证不出来.. ...
- neo4j基础操作
删除所有节点 MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r 创建节点 CREATE(:person{name:'潘峰',age:27}) CREATE( ...
- ArcGIS Enterprise 10.7.1新特性:批量发布服务
ArcGIS Enterprise 10.7.1提供了批量发布GIS服务的功能,能大大简化GIS系统管理员的工作量. 作为发布人员和管理人员,支持向Portal for ArcGIS添加云存储.文件共 ...
- Matlab中的变量名
在Matlab中使用save和load命令时,可能会出现变量名出错的问题. 如: save('A1.mat', 'A1'); load('A1.mat', 'A1'); 如果程序中还有名为a1的变量名 ...
- pve 导入 ova
匆忙记录 Proxmox includes qm importdisk as command. Extract your ova: tar -xvf *.ova Create a new VM wit ...
- Vue编程基础
一.依赖环境搭建: 添加镜像 # 安装好node.js后,使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 项 ...