AcWing 253. 普通平衡树
作者:互联网
一、题目解析
平衡树,\(Treap\)
众所周知\(Treap = BST + heap\)
堆不多说了。
说说这个\(BST\),就是说一个根节点\(p\),左儿子一定小于他,右儿子大于它。
也就是\(BST\)的中序遍历是严格单调递增的。
那么就可以进行一些操作了。
-
左旋与右旋
首先为了维护这个\(BST\)我们需要一个左旋\(zag\)和右旋\(zig\),分别表示将根节点和左右儿子交换位置,使交换后还满足\(BST\)的性质。
这个相当于一个模拟了,代码放在后面。
-
插入
这个可以从根节点开始,看看往左儿子走还是往右儿子走,一直走到空或者和自己相等的节点,然后进行插入。
-
删除
从根节点走,走到了这个节点就删除掉,如果走到的节点为空,那就不用管了,因为这个节点不存在。还有就是删除的时候如果遇到了叶节点可以直接删除,不会影响\(BST\)的性质。
-
最大最小
就是一直往左走或者一直往右走。 -
查排名和排名对应的数
排名可以一点点走,然后分类讨论,这个可以看代码注释。
排名对应的数也是一样,但这个得判断一下个数,所以\(BST\)里要有\(cnt\)和\(size\)两个变量表示节点个数和当前这个节点有多少个。
-
前驱和后继
具体定义参见题目描述。方法也是一样,前驱就是左边最大的,后继就是右边最小的,可以用递归写,会简单很多。
但是有的时候\(BST\)会退化成一条链,时间复杂度就大大升高了,但是只要\(BST\)够随机,期望高度就是\(log_2n\)。
所以的话就把它和堆集合在了一起,变成了平衡树。
其他的注释我放到代码里了。
标签:这个,删除,BST,儿子,排名,253,平衡,节点,AcWing 来源: https://www.cnblogs.com/littlehb/p/16241238.html