...首先我只会打Splay(伸展树),并不知道treap什么的...
而且没有系统的看过...只是看的一本名叫《高级数据结构》的书...
不过做题做了很多经典的了...
觉得这个东西主要还是看题目的需求吧。
平衡树首先比较适合的操作有插入删除,也可以像线段树一样加tag
一般只有两种情况:一是按照数值排序建立二叉树,二是按照序列的下标顺序建立二叉树。
对于第一种建树方法:常见的有求第k大的数,求前驱和后继,求最大最小值[这个用第二种也可以]。这个主要利用的还是二叉搜索树的性质和splay让二叉树保证结构稳定。
第二种建树方法:更多就在区间操作上了,例如翻转[这个比较特殊],同时加上数或同时赋成一个值。这个利用的就是splay完成的寻找区间操作以及树结构独特的标记色彩。
所以第一步办好了后面的事就是注意细节和看清题目了。
数据结构题非常容易犯细节错误——代码冗长....
我自己犯过的错误:
1.总是将儿子交代好,却忘记了儿子的父亲没赋值[主要体现在初始化数组的时候...]
2.下传标记忘记清空标记[线段树打少了...]
3.虚拟节点的标号搞不清[要知道其它节点因为它而变化了多少]
4.数组开小,忘记回收[这个还是没看清题的缘故...]