随笔分类 -  Splay树

摘要:该题应该有很多的解法,想过用二分查找,但是排序操作的复杂度让我们伤不起。这里用Splay来实现是很方便的。首先插入一个点,即第一个点,然后再依次用二叉排序树方式插入当前点,再把该点旋转到根部(这样方便我们找前驱和后继,否则需要中序遍历整棵树来确定),再在存在前驱和后继的情况下寻找前驱和后继。接下来就很好办了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#define L(x) tree[x].ch[0]#define R(x) tree 阅读全文
posted @ 2012-06-17 13:57 沐阳 阅读(339) 评论(0) 推荐(0) 编辑
摘要:该题是一道简单的区间求和题,跟杭电的敌兵布阵很是想象,这里是使用Splay写的。Splay就是伸展的意思,因为该树在使用过程中会大量的执行Rotate函数,该函数就是在保持二叉树中序遍历不变的情况下,使树的结构发生变化。该题中,二叉树中存储的值并不一定要求是顺序的,满足左孩子比根节点小,右孩子比根节点大,其大小只是一个构树时的顺序关系。每次旋转能够时确保目标节点一定要在旋转节点的下方,因为任何Rotate操作旋转节点的深度都是在降低的。Splay数的作用在于能够Splay操作选出区间,首先建立两个理论上的无穷小和无穷大点,如果选择区间[a, b],那么将a-1号节点旋转到根节点,再将b+1号节 阅读全文
posted @ 2012-06-16 17:47 沐阳 阅读(573) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示