【PAT A1066】Root of AVL Tree
#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相关推荐
- PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)
文章目录 题目分析 题目链接 题目分析 图片来源:acwing 分析 平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树:然后还要满足平衡树的基本特 ...
- PAT A1066 Root of AVL Tree ——春水碧于天,画船听雨眠
PAT A1066 Root of AVL Tree AVL这东西记一次忘一次,每次看就像披着初恋外衣的旧情人(or reverse) 以下应该是较为标准的模板方法,只是好久没有用过指针了,所以写了个 ...
- 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 ...
- 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码
Root of AVL Tree 2013年浙江大学计算机学院免试研究生上机考试真题,是关于AVL树的基本训练. 原题链接:PTA | 程序设计类实验辅助教学平台 题目描述 AVL 树是一种自平衡的 ...
- 【PAT甲级】A1051-A1100刷题记录
文章目录 (栈) A1051 Pop Sequence (25 分) 0.47 (静态链表) A1052 Linked List Sorting (25 分) 0.21 (静态树+先根遍历DFS) 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 ...
- 【PAT甲级】 1011 World Cup Betting
[PAT甲级] 1011 World Cup Betting 原题 With the 2010 FIFA World Cup running, football fans the world over ...
- 【PAT B-1037】在霍格沃茨找零钱
[PAT B-1037]在霍格沃茨找零钱 C++代码 方法一: // 将输入数据统一转换到最小单位,进行指定运算后,再将得到的结果转换到所要输出的格式 #include <bits/stdc++ ...
- 【PAT甲级】A1101-A1155刷题记录
文章目录 (递推) A1101 Quick Sort (25 分) 0.23 (静态二叉树+遍历) A1102 Invert a Binary Tree (25 分) 0.51 (数学问题) A110 ...
最新文章
- AC日记——传染病控制 洛谷 P1041
- java io 过滤数据,Java IO文件后缀名过滤总结
- (28)System Verilog进程间同步(事件event)
- c#连接sqlserver
- C#中如何截取Windows消息来触发自定义事件
- 树桩数组求逆序数+离散化(数太大)
- Linux系统基础入门
- 读嵌入式linux驱动程序设计从入门到精通 3
- html自动计算时间代码,原生JavaScript实现日期计算器功能
- TouchPanel--ESD_Check
- discuz论坛,discuz论坛程序,discuz论坛快速搭建
- Activity获得焦点----onWindowFocusChanged
- AutoCAD中导入图片
- 淘宝校招鸡蛋篮子算法题标准答案
- 中南民大计算机学院复试细则,中南民族大学各学院2019年考研复试细则
- 关于感染型病毒的那些事(一)
- 详细讲解vc 6.0进行DDK驱动开发【原创】
- Python pathlib Path
- 一个实现粒子爆炸效果的控件
- 中国科学院大学计算机学院夏令营,中国科学院大学2018年全国大学生“软件与网络”夏令营通知...