#include <cstdio>
#include <algorithm>
using namespace std;struct node
{int v, height; //v为结点权值,height为当前子树的高度node *lchild, *rchild; //左右孩子结点地址
} *root;node* newNode(int v) //生成一个新结点,v为结点权值
{node* Node = new node; //申请一个node型变量的地址空间,返回的是一个地址Node -> v = v; //结点权值为vNode -> height = 1; //结点高度初始为1Node -> lchild = Node -> rchild = NULL; //初始状态下没有左右孩子结点return Node; //返回新建结点的地址
}int getHeight(node* root) //获取以root为根结点的子树的当前height
{if(root == NULL) //空结点高度为0return 0;return root -> height; //返回高度
}void updataHeight(node* root) //更新结点root的height
{//max(左孩子结点的height, 右孩子结点的height) + 1root -> height = max(getHeight(root -> lchild), getHeight(root -> rchild)) + 1;
}int getBalanceFactor(node* root){ //计算结点root的平衡因子return getHeight(root -> lchild) - getHeight(root -> rchild);//左子树高度减去右子树高度
}void L(node* &root){ //左旋node* temp = root -> rchild; //root指向结点A, temp指向结点Broot -> rchild = temp -> lchild;temp -> lchild = root;updataHeight(root); //更新结点A的高度updataHeight(temp); //更新结点B的高度,其他结点高度未变root = temp; //temp变为根结点
}void R(node* &root){ //右旋node* temp = root -> lchild; //root指向结点B,temp指向结点Aroot -> lchild = temp -> rchild;temp -> rchild = root;updataHeight(root); //更新结点B的高度updataHeight(temp); //更新结点A的高度root = temp;
}void insert(node* &root, int v){ //插入权值为v的结点,注意此处需要带上引用符号&if(root == NULL) //到达空结点{root = newNode(v); //创建新结点return;}if(v < root -> v) //v比根结点权值小{insert(root -> lchild, v); //往左子树插入updataHeight(root); //更新树高if(getBalanceFactor(root) == 2){if(getBalanceFactor(root -> lchild) == 1) //LL型{R(root);}else if(getBalanceFactor(root -> lchild) == -1) //LR型{L(root -> lchild);R(root);}}}else{  //v比根结点权值大insert(root -> rchild, v); //往右子树插入updataHeight(root); //更新树高if(getBalanceFactor(root) == -2){if(getBalanceFactor(root -> rchild) == -1) //RR型{L(root);}else if(getBalanceFactor(root -> rchild) == 1) //RL型{R(root -> rchild);L(root);}}}}
/*
node* Create(int data[], int n){ //AVL树的建立node* root = NULL; //新建空根结点rootfor(int i = 0; i < n; i++){insert(root, data[i]); //将data[0]~data[n - 1]插入AVL树中}return root; //返回根结点
}
*/
int main(){int n, v; //n是结点数,v是权值scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", &v);insert(root, v);}printf("%d\n", root -> v);return 0;
}

【PAT A1066】Root of AVL Tree相关推荐

  1. PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)

    文章目录 题目分析 题目链接 题目分析 图片来源:acwing 分析 平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树:然后还要满足平衡树的基本特 ...

  2. PAT A1066 Root of AVL Tree ——春水碧于天,画船听雨眠

    PAT A1066 Root of AVL Tree AVL这东西记一次忘一次,每次看就像披着初恋外衣的旧情人(or reverse) 以下应该是较为标准的模板方法,只是好久没有用过指针了,所以写了个 ...

  3. PAT 1066. Root of AVL Tree (25) 回レ!雪月AVL

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

  4. 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码

    Root of AVL Tree  2013年浙江大学计算机学院免试研究生上机考试真题,是关于AVL树的基本训练. 原题链接:PTA | 程序设计类实验辅助教学平台 题目描述 AVL 树是一种自平衡的 ...

  5. 【PAT甲级】A1051-A1100刷题记录

    文章目录 (栈) A1051 Pop Sequence (25 分) 0.47 (静态链表) A1052 Linked List Sorting (25 分) 0.21 (静态树+先根遍历DFS) A ...

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

  7. 【PAT甲级】 1011 World Cup Betting

    [PAT甲级] 1011 World Cup Betting 原题 With the 2010 FIFA World Cup running, football fans the world over ...

  8. 【PAT B-1037】在霍格沃茨找零钱

    [PAT B-1037]在霍格沃茨找零钱 C++代码 方法一: // 将输入数据统一转换到最小单位,进行指定运算后,再将得到的结果转换到所要输出的格式 #include <bits/stdc++ ...

  9. 【PAT甲级】A1101-A1155刷题记录

    文章目录 (递推) A1101 Quick Sort (25 分) 0.23 (静态二叉树+遍历) A1102 Invert a Binary Tree (25 分) 0.51 (数学问题) A110 ...

最新文章

  1. AC日记——传染病控制 洛谷 P1041
  2. java io 过滤数据,Java IO文件后缀名过滤总结
  3. (28)System Verilog进程间同步(事件event)
  4. c#连接sqlserver
  5. C#中如何截取Windows消息来触发自定义事件
  6. 树桩数组求逆序数+离散化(数太大)
  7. Linux系统基础入门
  8. 读嵌入式linux驱动程序设计从入门到精通 3
  9. html自动计算时间代码,原生JavaScript实现日期计算器功能
  10. TouchPanel--ESD_Check
  11. discuz论坛,discuz论坛程序,discuz论坛快速搭建
  12. Activity获得焦点----onWindowFocusChanged
  13. AutoCAD中导入图片
  14. 淘宝校招鸡蛋篮子算法题标准答案
  15. 中南民大计算机学院复试细则,中南民族大学各学院2019年考研复试细则
  16. 关于感染型病毒的那些事(一)
  17. 详细讲解vc 6.0进行DDK驱动开发【原创】
  18. Python pathlib Path
  19. 一个实现粒子爆炸效果的控件
  20. 中国科学院大学计算机学院夏令营,中国科学院大学2018年全国大学生“软件与网络”夏令营通知...

热门文章

  1. 东软睿道实训日记—第六天
  2. 使用ffmpeg缩小视频体积的几种方式
  3. 微信小程序实现简单的树形图treeview
  4. ZYNQ LINUX开发笔记——内存直接访问
  5. linux复制文件夹排除文件,【linux】复制文件夹中文件,排除部分文件
  6. 单体架构迁移到微服务,8个关键的思考、实践和经验
  7. python的Scrap框架
  8. vs2019 利用Pytorch和TensorFlow分别实现DCGAN生成动漫头像
  9. PHP编写代码目的、要求、规范及细节
  10. Win10系统PowerShell执行.ps1文件