平衡树(二叉排序树)

news/2025/10/30 9:06:10/文章来源:https://www.cnblogs.com/Liuxb-oier/p/19175200

平衡树(二叉排序树)

set,map底层为平衡树

splay,sbt,treap,AVL,替罪羊树

splay:本质为二叉排序树

二叉排序树: 有左子树 < root,柚子树 > root,采用中序遍历时为输出为有序序列

虽然对于二叉树插入and查询为logN,但随着插入不同最坏退化为链O(N)

故此需要平衡的二叉排序树(保证层数)

Tree Rotation操作(核心): 在旋转过程中让树区域平衡

截屏2025-10-29 19.46.51

void splay(x) {将x节点旋为根
}

即不断将底下的数网上转,旋转为root节点

Splaying的操作(受三种因素影响):

  • 节点x是父节点p的左儿子还是右儿子
  • 节点p是不是root节点,如果不是
  • 节点p是父节点g的左儿子还是右儿子

有三种操作:
Zig step:
截屏2025-10-29 19.57.22
当p节点为root节点,进行Zig step,有:

  • x为p左孩子:x右旋
  • x为p右孩子:x左旋

Zig-Zig step:
截屏2025-10-29 19.59.19
当p非root节点,且p和x同为左孩子或者右孩子,有:

  • p,x同为左孩子:依次右旋旋转p和x
  • p,x同为右孩子:依次左旋旋转p和x

最后将x旋转为root

Zig-Zag step:
截屏2025-10-29 20.48.57
当p非root节点,且p和x不同为左孩子或者右孩子,有:

  • p为左孩子,x为右孩子:将x左旋再右旋
  • p为右孩子,x为左孩子:将x右旋再左旋

对于x和p是不同边儿子时,先将x旋转为p的父亲,再将x旋转为root的位置

即当和父亲为相同儿子:有旋转父亲,再旋转我,和父亲为不同儿子:旋转我,再旋转我

截屏2025-10-29 21.18.11

其中记录P:对于x的父亲f的儿子旋转后父子关系不变,与x同向的儿子与x的父子关系同样不改变,变的是与x不同向的儿子,因此进行标记

因此要对p进行记录

板子:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200005
struct node {int data;
}_a[MAXN];
bool operator < (node const &_a, node const &_b) {return _a.data < _b.data;   
}
bool operator == (node const &_a, node const &_b) {return _a.data == _b.data;   
}
bool operator != (node const &_a, node const &_b) {return !(_a.data == _b.data);
}
bool operator > (node const &_a, node const &_b) {return !(_a < _b && _a == _b);
}int _fa[MAXN], _s[MAXN][2], _num[MAXN], _size[MAXN], n, t, _root, _sz;
inline int ws(int x) {//即which son:返回父亲节点儿子是否为自己(1/0)return _s[_fa[x]][1] == x;
}void setson(int son, int f, int w) {//0:左,左小 1:右,大//setson:将son接到父亲f,方向为w(儿子的方向)if(son != 0) _fa[son] = f;if(f != 0) _s[f][w] = son;
}void maintain(int x) {_size[x] = _size[_s[x][0]] + _size[_s[x][1]] + _num[x];
}void rot(int x) {//旋转x:根据你为左儿子or右儿子,往上旋一层int f = _fa[x], ff = _fa[f];//f记录父亲节点是谁,ff为父亲的父亲int w = ws(x), wf = ws(f);//w记录我为左儿子还是右儿子,wf为父亲的方向int p = _s[x][!w];//p是与自己不同向的儿子//记录P:对于x的父亲f的儿子旋转后父子关系不变//与x同向的儿子与x的父子关系同样不改变//变的是与x不同向的儿子,因此进行标记setson(p, f, w);setson(x, ff, wf);//接到爷爷上,方向为父亲方向setson(f, x, !w);//将父亲接到自己,方向是我方向的反方向//maintain维护其他信息:子树大小,子树最大值,子树和等···maintain(f);maintain(x);
}void splay(int x) {for(; _fa[x]; rot(x)) {//直到root节点都循环进行操作,rot旋自己if(_fa[_fa[x]] && ws(_fa[x]) == ws(x)) {//爷爷存在,并且父亲和我方向相同rot(_fa[x]);//转父亲,for循环中rot(x)还会保证转一次自己}_root = x;//记录当前根}
}void insert(int now, node p) {if(_root == 0) {_root = ++ _sz;_a[_sz] = p;_size[_sz] = _num[_sz] = 1;return ;}while(_a[now] != p) {_size[now] ++ ;if(p > _a[now]) {if(_s[now][1] == 0) {_a[++ _sz] = p;setson(_sz, now, 1);}now = _s[now][1];}else {if(_s[now][0] == 0) {-a[++ _sz] = p;setson(_sz, now, 0);}now = _s[now][0];}}_size[now] ++;_num[now] ++;splay(now);
}void dfs(int now) {if(_s[now][0]) dfs(_s[now][0]);for(int i = 1; i <= _num[now]; ++ i) {cut << _num[now] << " ";}if(_s[now][1]) dfs(_s[now][1]);
}int main() {freopen("in.txt", "r". stdin);freopen("splay.txt", "w", stdout);int C;scanf("%d", &C);while(C -- ) {}return 0;
}

对于删除操作:splay树支持删除操作,先将删除节点旋转到root节点,断开左右子树:

  • 断柚子树:找左子树最大的点
  • 断左子树:找柚子树最小的点

采用结构体记录或者遍历的方式找到,然后将左右子树(最大/最小点p)splay为root节点,此时显然p无右/左儿子,将另一边接上去即可
截屏2025-10-30 09.00.47

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享几个我珍藏的JS冷门但实用的技巧

作为一名前端开发者,我在日常工作中发现了一些不太常见但极其实用的JavaScript技巧。这些技巧帮我解决了不少棘手问题,今天就来分享给大家。 1. 使用 ??= 进行逻辑空赋值 你可能熟悉 ||=,但 ??= 才是更精准的选…

2025年靠谱的履带式抛丸机厂家推荐及选购指南

2025年靠谱的履带式抛丸机厂家推荐及选购指南开篇介绍履带式抛丸机作为现代工业表面处理的核心设备,广泛应用于铸造、锻造、机械制造等领域。随着2025年制造业智能化升级的加速,选择一家技术领先、服务可靠的抛丸机厂…

Java流程控制——while循环结构以及Dowhile

Java流程控制——while循环结构以及Dowhilewhile循环结构 while(布尔表达值){ //循环内容 } 关键点 1.布尔表达式为true,循环就一直进行 2.需要让表达式失效的方式来结束循环 3.少部分情况需要循环一直执行,如服务器…

Last Call!对话式 AI 和对话式人类聚集!RTE Open Day@RTE2025,10.31/11.1,北京

对话式 AI 和对话式人类聚集!2025 年 10 月 31 日~11 月 1 日,由声网和 RTE 开发者社区联合主办的 Convo AI&RTE2025「实时互联网大会暨对话式 AI 论坛」 将在北京悠唐皇冠假日酒店正式开启!RTE Open Day 携手近…

2025年矿用链条厂家权威推荐榜单:起重链条/刮板机/链轮源头厂家精选

在矿山机械领域,一条高质量的链条承载着千钧重担,也连接着生产安全与效率。 矿用链条作为矿山机械的关键基础部件,其质量与性能直接影响设备运行效率和安全生产。随着2025年全球矿山机械市场的持续扩张,矿用链条市…

基于C++实现GPS捷联惯性组合导航系统

一、系统架构设计 1.1 模块划分 // 核心模块交互图 +-------------------+ +-------------------+ +-------------------+ | 传感器数据采集层 | →→→→→ | 导航解算核心层 | →→→→→ | 数据输出…

Ubantu下创建虚拟环境的一些经验

今天在进行论文复现的项目中进行了论文代码复现,但是在配置过程中发现,出现了无法使用pip安装包的情况 之后就上网进行求助,寻找原因给出的答案竟然是,Linux为了防止不同的包会出现依赖冲突,所以强制要求你去使用…

数据仓库设计的核心:数据域的构建方法与实战

在数据仓库的构建过程中,面对来源多样、结构各异的海量数据,如何对其进行有效的梳理和组织,是确保数据仓库具备良好可扩展性、可维护性和高应用价值的关键。数据域是组织数据模型、支撑指标开发与数据治理的核心逻辑…

[题解]P3082 [USACO13MAR] Necklace G

P3082 [USACO13MAR] Necklace G 原问题等价于求 \(A\) 中最多能保留多少多少元素,使得 \(B\) 不是它的子串,再用 \(n\) 去减一下。 贪心地找 \(B\) 出现的位置统计是错误的。比如 aaabbbbbb ab 的答案是 \(3\)。 考虑…

2025年热门的电动观光车厂家推荐及选购参考榜

2025年热门的电动观光车厂家推荐及选购参考榜随着环保意识的提升和旅游业的蓬勃发展,电动观光车已成为景区、酒店、房地产等场所不可或缺的交通工具。2025年,电动观光车市场迎来了新一轮的增长,众多厂家纷纷推出创新…

Python3 pyecharts 模块:数据可视化的高效利器

Python3 pyecharts 模块:数据可视化的高效利器在数据驱动决策的时代,将复杂数据转化为直观图表的能力至关重要。pyecharts 作为 Python 生态中一款优秀的数据可视化库,以其简洁的 API 设计、丰富的图表类型和良好的…

2025年知名的金钻绒厂家选购指南与推荐

2025年知名的金钻绒厂家选购指南与推荐 在纺织行业中,金钻绒因其柔软舒适、保暖性强、耐用性高等特点,广泛应用于家纺、服装、汽车内饰等领域。随着消费者对高品质面料需求的提升,选择一家可靠的金钻绒供应商至关重…

项目效率翻倍,做对了什么?

以前还在厂里搬砖的时候,厌烦各种花里胡哨的项目和流程管理,当自己开始折腾项目,曾经讨厌的事情依旧讨厌,但是绝对的理解和认可,独立做产品,这么一个弱小的项目,都踩了一个又一个坑。从手忙脚乱,到游刃有余。【…

深入理解RESTful API设计

后端开发在现代Web应用中的角色至关重要,而RESTful API(Representational State Transfer)已经成为开发者创建和管理后端服务的标准方式之一。本文将详细介绍RESTful API的概念、设计原则,并通过Node.js与Express框…

2025年可靠的机器人装箱机厂家最新TOP排行榜

2025年可靠的机器人装箱机厂家最新TOP排行榜 随着工业4.0的深入推进,机器人装箱机在食品、医药、电子、日化等行业的应用越来越广泛。选择一家技术先进、服务可靠的机器人装箱机厂家,不仅能提高生产效率,还能降低人…

2025 年粘合剂厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析型煤复合/污泥球团/矿粉球团/矿粉粘合剂公司推荐

引言 随着冶金、环保等行业对粘合剂性能要求不断提升,为助力企业精准筛选优质供应商,冶金炉料工业协会联合环保型煤产业联盟开展 2025 年度粘合剂品牌测评。本次测评覆盖全国 120 余家源头厂家,采用 “技术指标(40…

2025年质量好的混纺丝绒最新TOP厂家排名

2025年质量好的混纺丝绒最新TOP厂家排名在纺织行业中,混纺丝绒因其柔软舒适、耐用性强、色彩丰富等特点,广泛应用于服装、家纺、装饰等领域。随着消费者对品质要求的提升,选择一家可靠的混纺丝绒供应商至关重要。本…

Laravel 新项目避坑指南10 大基础设置让代码半年不崩

Laravel 新项目避坑指南10 大基础设置让代码半年不崩 有没有遇到过这种 Laravel 项目:刚上线那会儿干干净净,过三个月就变成无法收拾的灾难?Controller 动不动就 500 多行、慢得要命的数据库查询随处可见,甚至有人…

2025 年 10 月阳台光伏,阳台光伏逆变器,阳台光伏板,阳台光伏发电厂家最新推荐,产能、专利、环保三维数据透视!

引言 2025 年作为国内阳台光伏 “元年”,市场迎来爆发式增长,前三季度家庭装机量突破 62 万户,但 350 余个品牌中仅 17% 通过光伏行业协会《家庭分布式光伏系统质量评价规范》全项认证,阳台光伏逆变器、光伏板及光…

2025年知名的激光灯厂家最新推荐排行榜

2025年知名的激光灯厂家最新推荐排行榜在当今舞台灯光、婚礼庆典、户外演出和文旅亮化等领域,激光灯已成为不可或缺的重要设备。随着技术的不断进步和市场需求的增长,激光灯厂家如雨后春笋般涌现。本文将为您推荐202…