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的更多相关文章

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

  2. PAT_A1066#Root of AVL Tree

    Source: PAT A1066 Root of AVL Tree (25 分) Description: An AVL tree is a self-balancing binary search ...

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

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

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

  6. PAT甲级1066. Root of AVL Tree

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

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

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

  9. pat1066. Root of AVL Tree (25)

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

随机推荐

  1. taro实战1

    npm install -g @tarojs/cli //或 yarn global add @tarojs/cli

  2. 2.请介绍一下List和ArrayList的区别,ArrayList和HashSet区别

    第一问: List是接口,ArrayList实现了List接口. 第二问: ArrayList实现了List接口,HashSet实现了Set接口,List和Set都是继承Collection接口. A ...

  3. 关于idea easyui 引入css js

    1.引用官方网站 <link rel="stylesheet" type="text/css" href="http://www.w3cscho ...

  4. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  5. jquery和js的几种页面加载函数的方法以及执行顺序

    参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html    https://www.cnblogs.com/james641/p/783837 ...

  6. 不幸,我的Ryzen 7 1700X中招了,也有segfault

    在历经了I7-5775C,I7-5820K之后,决定尝鲜用一下为AMD漂亮翻身的Ryzen 7,海淘了一颗Ryzen 7 1700X 最近听说在极重负载的情况下,CPU会出错,于是从网上找来Kill- ...

  7. Socket初见

    前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  8. asp.net—WebApi跨域

    一.什么是跨域? 定义:是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制. 同源策略限制了以下行为: 1.Cookie.LocalStora ...

  9. Nginx 完整安装篇

    第一步安装各种编译库如c++编译库等 yum install -y gcc //安装GCC ...安装过程省略 yum install -y gcc-c++ //安装C++库用来编译c++ ...安装 ...

  10. 通过JPA注解获取某个类的主键字段

    public String getPkColumn(String className) { String pkColumn = null; try { Class clazz = Class.forN ...