伸展树(Splay Tree)小结

伸展树(Splay Tree)


一般情况下的建树似乎和线段树差不多。
1):插入一个元素:对于在原序列x位置插入一个元素(就是在x-1和x中间),那么首先找到第x-1个元素,然后将其旋转到根节点(root),这个过程就是splay的过程,然后再找到第x个元素所在位置,将其旋转到根的右子树,这样将要插入的元素就放在root->ch[R]->ch[L]上这个位置,按照中序遍历该节点就在x-1和x之间了。
2):删除一个元素:删除在当前序列中第x位置处的元素,那么找到第x元素,然后利用splay将其伸展到根节点,再将第x+1个元素利用splay将其伸展到根节点的右子树即为:root->ch[R],我们知道root->ch[R]的左子树必然为空的,然后将root->ch[L]接到root->ch[R]->ch[L]上,root向右子树前进一步,这样就删掉了原来的那个根节点即为第x个元素。
3):修改一个元素的值:将要修改当前序列的第x个值,还是要找到第x个元素,然后将其splay到根,然后就可以将其值修改了。
4):询问一个区间的最值:询问区间【x,y】的最值,首先找到第x-1个元素,然后将其splay到根,再找到第y+1个元素,并将其splay到根的右子树,这样根的右子树的左子树就是我们所要询问的区间了,根据原来的记录即可得到我们想要的值。
对于上述的插入、删除操作都是对一个元素来进行的,当然我们不难想到当我们想要插入删除一个序列也是不难做到的,实质上还是上面的那几步。对于伸展树还有很多的灵活的应用,这个就和线段树差不多了,有些时候需要记录一些信息,对于某些信息从父节点到子节点进行更新,同时对某些信息从子节点向父节点进行更新。我想对于如果掌握了伸展树的基本操作和线段树的基本操作来处理这些就不难了吧!

你可能感兴趣的:(tree)