文章目录

  • 题目分析
  • 题目链接

题目分析



图片来源:acwing
分析
平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树;然后还要满足平衡树的基本特性,就是任意一个结点的左右子树高度之差不超过1.

不平衡的BST可以经过左旋或者右旋变成新的平衡树。左旋和右旋只是改变树的结构,不会改变树的中序遍历结果。

以下图说明右旋的过程,实际上,下图已经是平衡树,不用旋转。仍然可以说明右旋的具体操作。下图中L[]数组表示左儿子,R[]数组表示右儿子。

右旋分为三步:1)B变成根;2)A变成B的右孩子;3)把E变成A的左孩子。


实现右旋的代码如下:其中update是一个函数,用来计算结点高度。请读者对照上图阅读本代码。

/*
右旋
u 是结点
*/
void R(int& u){int p =l[u]; //左儿子记为pl[u] =r[p];//p的右儿子(E)变成原来根(A)的左儿子r[p] = u;  //新根的右儿子是原来的根uupdate(u),update(p); //重新计算高度u = p; //根结点变成左儿子p
}

将右图转化为左图就是左旋,如下图。


左旋代码:和右旋正好对称,将l和r互换即可。

void L(int& u){int p = r[u];//右儿子(图中的A)记pr[u] = l[p]; //p(图中的A)的左儿子(图中的E)变成原来根(图中的B)的右儿子l[p] = u; //原来的根(图中的B)变成p(图中的A)的左儿子update(u),update(p); //重新计算结点的高度u = p;
}

ac代码
四种情况如下图,insert()函数用来构造AVL树,以A为树根。

如果if(get_balance(u) == -2),表示 右子树比左子树高度高2,可以有两种情况。 先取A的右孩子B,第一种是如果if(get_balance(u) == -1) 即B的右子树高度比左子树高1,即情况[2],此时左旋A;另一种是B的左子树高度比右子树高1,即情况[4].此时先右旋B,再左旋A。

如果if(get_balance(u) == 2) 表示左子树高度比右子树高2,可以分为两种情况。先取A的左儿子B。第一种情况是如果if(get_balance(u) ==1) 表示B的左子树比右子树高度高1,即情况[1],此时右旋A; 另一种是B的右子树比左子树高1,即情况[3].此时先左旋B,再右旋A。


#include<bits/stdc++.h>
using namespace std;const int N = 40;
int l[N],r[N],v[N];//权值
int n;
int h[N];//高度
int idx; /*update求每一结点的高度*/
void update(int u){h[u] =max(h[l[u]] , h[r[u]]) + 1;
}/*
右旋
u 是结点
*/
void R(int& u){int p =l[u]; //左儿子成为新的根l[u] =r[p];//根的左儿子变成r[p] = u;  //新根的右儿子是原来的根uupdate(u),update(p); //重新计算高度u = p; //根结点变成左儿子p
}/*
左旋
u是结点
*/
void L(int& u){int p = r[u];//右儿子成为新根r[u] = l[p];l[p] = u;update(u),update(p);u = p;
}
/*
get_balance左子树和右子树高度差
*/
int get_balance(int u){return h[l[u]] -h[r[u]];
}/*
insert建平衡树
1.二叉搜索树
2.高度差≤1
*/
void insert(int &u, int w){if(u==0){u =++idx;v[u] =w;}else if(w< v[u]){insert(l[u],w);//左子树比右子树高2 情况[1]if(get_balance(u) ==2){//以左儿子为根,其左子树以右子树高1if(get_balance(l[u]) ==1) R(u);//以左儿子为根,其右子树比左子树高1 如情况[3]else L(l[u]),R(u);}} else {insert(r[u],w);//右子树比左子树高2 如情况[2]if(get_balance(u) == -2){//以右儿子为根,其右子树比左子树高1,if(get_balance(r[u]) == -1) L(u);//以右儿子为根,其左子树比右子树高1else R(r[u]),L(u);}}update(u); //求u结点的高度
}int main(){cin >> n;int root =0;while(n--){int w;cin>> w;insert(root ,w);}//输出avl树根cout<<v[root]<<endl;
}

题目链接

PAT甲级1066 Root of AVL Tree (25分)

acwing1552. AVL树的根

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

  1. 1066 Root of AVL Tree (25 分)【难 / 知识点: 平衡树 未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805404939173888 平衡树之前学过,不过有忘完了,有时间补吧

  2. PAT甲级1127 ZigZagging on a Tree (30分):[C++题解]之字形层次遍历树bfs实现一层一层读入

    文章目录 题目分析 题目链接 题目分析 分析 给定中序遍历和后序遍历,先建树: 后面就是写一个bfs,层序遍历稍微改改即可. bfs要做的修改是如何一层一层的读入.令根结点是第一层,本题的之字形遍历就 ...

  3. PAT甲级1064 Complete Binary Search Tree (30分):[C++题解]完全二叉搜索树BST

    文章目录 题目分析 题目链接 题目分析 思路: 第一步,构造含有n个结点的完全二叉树:第二步,将n个数值填入,使其满足二叉搜索树的性质. 对于第一步: 完全二叉树用一维数组可以存下,不过从根结点的下标 ...

  4. 【PAT - 甲级1094】The Largest Generation (25分)(dfs建树)

    题干: A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level ...

  5. 【PAT - 甲级1017】Queueing at Bank (25分)(优先队列,模拟)

    题干: Suppose a bank has K windows open for service. There is a yellow line in front of the windows wh ...

  6. 【PAT甲级 - 1013】Battle Over Cities (25分)(并查集)

    题干: It is vitally important to have all the cities connected by highways in a war. If a city is occu ...

  7. PAT甲级 -- 1002 A+B for Polynomials (25 分)

    This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...

  8. 【PAT - 甲级1012】The Best Rank (25分)

    题干: To evaluate the performance of our first year CS majored students, we consider their grades of t ...

  9. 【PAT - 甲级1009】Product of Polynomials (25分)(模拟,细节)

    题干: This time, you are supposed to find A×B where A and B are two polynomials. Input Specification: ...

最新文章

  1. 转:ASP.NET状态保存方法
  2. 80%的Android手机用户面临浏览器安全风险
  3. NUC1373 Bank Interest【水题】
  4. spring_ioc,DI
  5. (十三)RabbitMQ使用详解
  6. java捕捉了异常_java 异常捕获与异常处理
  7. oracle 控制html输出样式,Oracle之sqlplus输出到html
  8. 【kafka】kafka Producer Metadata概述及源码分析
  9. 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列
  10. Python模块Pygame安装
  11. 多个table 相同col 的 设置相同width
  12. 现代通信原理:第七章部分习题答案
  13. Google Code 开源项目
  14. Linux与Windows设置共享文件夹的实现
  15. 捏着鼻子也要吃? 吃蔬菜几大误区盘点
  16. Kafka学习征途:不再依赖ZK的KRaft
  17. Fiddler抓包软件[一]下载与安装
  18. 修改Google Chrome主页
  19. python svg转png_如何使用Python3实现svg转png与pdf(附转换源代码)
  20. 为Symbian程序中的图片增加半透明效果

热门文章

  1. plsql与64位的Oracle关联方法
  2. 解决浮层弹出如何加上datepicker,并且浮动在上面
  3. 在项目中代替DevExpress(一)
  4. 构造一个完美的分类系统
  5. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  6. 2.7 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授
  7. 安装中文版man手册,同时保留原英文版手册
  8. 【PC工具】windows批处理脚本一键bat脚本编辑器,bat转exe工具使用方法,附helloworld参考例程...
  9. Ubuntu16.04安装opencv-3.4.2
  10. 转-WinRM service