A1066. Root of AVL Tree
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<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct NODE{
struct NODE* lchild, *rchild;
int key;
int height;
}node;
int getHeight(node* root){
if(root == NULL)
return ;
else return root->height;
}
void updateHeight(node *root){
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + ;
}
void L(node* &root){
node* temp = root;
root = root->rchild;
updateHeight(root);
temp->rchild = root->lchild;
root->lchild = temp;
updateHeight(temp);
}
void R(node* &root){
node *temp = root;
root = root->lchild;
updateHeight(root);
temp->lchild = root->rchild;
root->rchild = temp;
updateHeight(temp);
}
void insert(node* &root, int key){
if(root == NULL){ //此处可获得插入节点的信息
node* temp = new node;
temp->lchild = NULL;
temp->rchild = NULL;
temp->key = key;
temp->height = ;
root = temp;
return;
}
if(key < root->key){ //此处可获得距离插入节点最近得父节点得信息
insert(root->lchild, key);
updateHeight(root);
if(abs(getHeight(root->lchild) - getHeight(root->rchild)) == ){
if(getHeight(root->lchild->lchild) > getHeight(root->lchild->rchild)){
R(root);
}else{
L(root->lchild);
R(root);
}
}
}else{
insert(root->rchild, key);
updateHeight(root);
if(abs(getHeight(root->lchild) - getHeight(root->rchild)) == ){
if(getHeight(root->rchild->rchild) > getHeight(root->rchild->lchild)){
L(root);
}else{
R(root->rchild);
L(root);
}
}
}
}
int main(){
int N, key;
scanf("%d", &N);
node* root = NULL;
for(int i = ; i < N; i++){
scanf("%d", &key);
insert(root, key);
}
printf("%d", root->key);
cin >> N;
return ;
}
总结:
1、题意:按照题目给出的key的顺序,建立一个平衡二叉搜索树。
2、二叉搜索树的几个关键地方:
- 每个节点使用height来记录自己的高度,叶节点高度为1;
- 获得某个节点高度的函数,主要是由于在获取平衡因子时,有些树的子树是空的,需要返回0,为避免访问空指针,获取节点高度都要通过该函数而非height字段。
- 更新当前节点的高度,应更新为左右子树的最大高度+1。
- 左旋与右旋:一定是三步操作而不是两步(不要忘记新的root的原子树)。注意更新节点高度的先后顺序。
- 插入与建树:插入操作基于二叉搜索树的插入。在root = NULL时进行新建节点并插入,在此处可以获得插入节点的信息。而在递归插入语句处,可以获取插入A节点之后距离A节点最近的父节点。因此在递归插入结束后就要对该节点进行更新高度,并在此处更新完之后检查平衡因子,并做LL、LR、RR、RL旋转。
3、对rootA的左子树做插入,导致rootA的左子树与右子树高度差为2,则对以rootA为根的树旋转。
4、调试的时候,可以取很少的几个节点,然后画出调试过程中树的形状。
A1066. Root of AVL Tree的更多相关文章
- PAT甲级——A1066 Root of AVL Tree
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- PAT_A1066#Root of AVL Tree
Source: PAT A1066 Root of AVL Tree (25 分) Description: An AVL tree is a self-balancing binary search ...
- 04-树5 Root of AVL Tree + AVL树操作集
平衡二叉树-课程视频 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the tw ...
- PAT 1066 Root of AVL Tree[AVL树][难]
1066 Root of AVL Tree (25)(25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, ...
- PTA (Advanced Level) 1066 Root of AVL Tree
Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of ...
- PAT甲级1066. Root of AVL Tree
PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...
- 04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- 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 ...
- pat1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
随机推荐
- MyBatis映射文件6
之前说了由Employee找Department,这一节讲一讲由Department找Employee,显然前者是多对一的关系,而后者是一对多的关系. Department的JavaBean: pri ...
- font_awesome的icon库的使用
1.使用cdn引入font_awesome图标库的css文件 例如:index.htm <html><head><title>font_awesome test&l ...
- for 循环增强
package cn.zhou.com; /* * 增强for循环 * * for(int i:arr) * { * System.out.print(i+1+" "); * } ...
- tensorflow中使用指定的GPU及GPU显存 CUDA_VISIBLE_DEVICES
参考: https://blog.csdn.net/jyli2_11/article/details/73331126 https://blog.csdn.net/cfarmerreally/arti ...
- 对mysql 单表备份
#!bin/bash cd C:\Program Files\MySQL\MySQL Server 5.5\bin set "Ymd=%date:~,4%%date:~5,2%%date:~ ...
- C# json解析
json格式数 [{ , , , "ItemCode": "UBAC11211OF-A54", "basicName_bg": " ...
- mvc 学前必知
MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性.可移植性,代码的可 ...
- Modbus CRC 16 (C#)
算法 1.预置一个值为 0xFFFF 的 16 位寄存器,此寄存器为 CRC 寄存器. 2.把第 1 个 8 位二进制数据(即通信消息帧的第 1 个字节)与 16 位的 CRC 寄存器相异或,异或的结 ...
- 【python练习题】程序7
#题目:将一个列表的数据复制到另一个列表中. l = [1,2,3,4,5,6,7,8] m = [] m = l[:] print (m)
- 在线制作css动画——CSS animate
熟悉CSS的人都知道,CSS可以实现很多漂亮的动画,特别是它的在线功能,能够帮助人们解决很多制作动画的效果.今天特别推荐一个在线CSS插件功能——cssanimate,这个最大的特色就是以图形界面方式 ...