正在备战 CSP-S 的小 w 愤然写下了这篇文章,因为赛前的模拟考试让 ta 摸不着头脑。比赛结束了,小 w 考的很糟糕,然而,ta 在第四题的题解里看到了这样一句话:
平衡树是提高组考纲里的内容。
岂有此理,居然敢明目张胆地超纲!小 w 清楚,这场比赛的难度是对标 NOIp 的,ta 心里想道:既然这样,我一定要学会平衡树!! 于是,wkd 的平衡树学习之路就这样开始了......
平衡树好像很吓人啊,看不懂,不想学。记住,特别是在学新算法的时候,千万不要被算法的名字给吓跑了,平衡树就是一棵二叉树而已,每个结点存储一个值,没了。~~当然,好像也没有这么夸张的简单。~~总之,学习平衡树之前,我们得先认识一种特别的二叉树:二叉搜索树!
何为“二叉搜索树”? 二叉搜索树,是一种特殊的二叉树,你也可以叫他二叉排序树,因为他具有搜索和排序的功能。二叉搜索树的定义很简单:如果在一棵二叉树上,任意结点 $x$ 左子树里的所有点权总是小于 $x$ 的点权,而右子树里的所有点权总是大于 $x$ 的点权,我们就说这棵树是一棵二叉搜索树。比如这个:

图 1
还有这个:

图 2
你可能会发现,两棵二叉树都是二叉搜索树,但上面的看起来均衡一些,也就是平衡一些;而下面的则看起来不太平衡,根节点没有左子树,树的高度也比第一个要高。但是,其实这两棵树对应的序列是一样的,都是 $a=[2,5,6,7,8]$,而二叉搜索树其实就是对应一个序列而生成的,主要目的就是快速维护序列。如果你仔细观察,你可能会发现二叉搜索树的这几个性质:
没错,我们平衡树学习的第一站就是 Treap! Treap 是什么?其实 Treap 的名字类似于缝合怪,也就是“Tree + Heap = Treap”。Tree 就是树,Heap 就是堆,那么 Treap 可想而知就是一棵树满足堆的性质。这里我们维护的是一个大根堆,而我们点上的权值就多了一种满足堆性质的权值,这个权值是随机的。那么,有了这个堆的性质,能帮助到我们什么呢?没错,只要有了它,我们就可以保证二叉搜索树的高度近似于 $\log n$,也就是平衡了!为什么会这样呢?