数据结构期中

左偏树

把原树的空儿子节点补上空的外部节点(记为黑点)

定义 s(u) 为节点 u 到其子树内黑点的最小距离

左偏树是一个二叉堆(假设是大根堆),每个节点均满足:左儿子节点的 s 值大于右儿子节点的s值

支持的操作:两棵左偏树的合并

插入、删除操作均可以规约到两棵左偏树的合并问题

两棵左偏树的合并操作

假设合并的是 $ T_{1},T_{2} $

沿最右路径递归合并,满足:

(设当前两棵树的根节点为 $ u, v $)

若两者其一为空,则停止合并

若两者均不为空,则取权值最大值为根(满足大根堆性质),不妨设是 $ u $,然后递归合并 $ u $ 的右子树和 $ v $

回溯后,检查 $ u $ 是否满足左偏性质(左儿子节点的 s 值大于右儿子节点的s值),若不满足则 swap 左右子树;然后重新计算 $ u $ 的 s 值

整个回溯过程不断拼接合并的结果,并检查递归路径上所有节点是否满足左偏性质(左儿子节点的 s 值大于右儿子节点的s值),若不满足则 swap 左右子树,同时更新新的 s 值。可以证明这样复杂度是 $ O(\log n) $ 的。

搜索树

二叉搜索树

每个节点 $ u $ 存储原有信息 $ a_i $ 外还有一个权值 $ w_{u} $,满足:

\[w_{v \in T_{ls_u}} < w_{u} < w_{v \in T_{rs_u}} \]

* 若取等则称 可有重复值的二叉搜索树
**“权值”也叫“关键字”

注意到每个节点的左子树大小(LeftSize)即为当前节点的排名(Rank)

支持的操作:

1.find(k):返回权值为 k 的数对
2.get(index):返回第 index 个数对
3.insert(p):插入权值 p 与信息 a
4.erase(k):删除权值为 k 的数对
5.ascend(d):按关键字升序输出所有数对

find(k)

在树上对 $ w $ 二分查找即可

get(index)

二分size:若左子树大小大于 index,则在左子树,小于 index,则在右子树

insert(p)

在树上做一次 find(p),如果发现能找到,则用 a 更新信息,否则在断点(一定是叶子)插入 (p,a)

erase(k)

先做一次find(k),找到位置

如果删除的是叶子节点(儿子数为0),直接删除即可
如果删除的是链节点(儿子数为1),删除后链接
如果删除的是有两个儿子的节点,用 左子树最大值 或 右子树最小值替换当前节点,然后删除即可


在二叉搜索树中,各种操作的复杂度都是基于当前树高 h 的(事实上均是 $ O(h) $,极端情况可以退化成链表,变成 $ O(n) $。

理想情况下的树高是 log 量级的,各种操作时间是 $ O(\log n) $,由此引入了平衡树。

平衡树

关于一棵搜索树是否「平衡」,不同的平衡树中对「平衡」有着不同的定义.比如以 T 为根节点的二叉搜索树,左子树和右子树的高度相差很大,或者左子树的节点个数远大于右子树的节点个数,这棵树显然不具有平衡性.

对于二叉搜索树来说,常见的平衡性的定义是指:以 T 为根节点的树,每一个结点的左子树和右子树高度差最多为 1.

平衡树的调整过程

左旋(Left Rotate或zag)、右旋(Right Rotate或zig)

值得注意的是,这两种操作均不改变平衡树的中序遍历序列.

四种平衡性破坏的情况

LL 型:T 的左孩子的左子树过长导致平衡性破坏.

调整方式:右旋节点 T.

RR 型:与 LL 型类似,T 的右孩子的右子树过长导致平衡性破坏.

调整方式:左旋节点 T.

LR 型:T 的左孩子的右子树过长导致平衡性破坏.

调整方式:先左旋节点 L,成为 LL 型,再右旋节点 T.

RL 型:与 LR 型类似,T 的右孩子的左子树过长导致平衡性破坏.

调整方式:先右旋节点 R,成为 RR 型,再左旋节点 T.

AVL 树

要求:

对于每个节点的左右儿子 $ L,R $:

1.$ T_L,T_R $ 是 AVL 树
2.$|h_L-h_R| \le 1 $

支持操作:

由于这是一棵二叉搜索树,所以查询过程与其相同,下面介绍修改过程

1.insert(p)
2.earse(p)

下面我们记 $ bf(u) $ 为节点 $ u $ 的 左子树高度 减 右子树高度,称为平衡因子

容易发现一个AVL树所有节点的 bf 值取值只可能是 -1,0,1

insert(p)

先进行一次朴素的二叉搜索树插入,然后考虑重新调整这棵树,使其变为 AVL 树

不合法 bf 值 只可能出现在 新插入节点到根节点这条路径上

递归从下往上维护即可

earse(p)

同insert(p)

posted @ 2026-11-03 22:52  象征阳光  阅读(2)  评论(0)    收藏  举报