现在开始学习splay树。splay树的核心操作就是树的旋转现在我们开始学习树的旋转。
树的单旋
树的单旋有两种,是基本的操作。
1.左旋(ZAG)
针对一个节点进行左旋:
第一步:建立指针指向这个节点
第二步:将该节点的右孩子的左孩子挂载成为当前节点的右孩子。
第三步:将指针指向该节点的右孩子,将该节点挂在到它的右孩子上,成为它的右孩子的左孩子
别慌。。。见图所示:
我们对1节点进行右旋:
第一步:
第二步:
第三步:
2.右旋(ZIG)
右旋对左旋就是镜像关系:
针对一个节点进行左旋:
第一步:建立指针指向这个节点
第二步:将该节点的左孩子的右孩子挂载成为当前节点的左孩子。
第三步:将指针指向该节点的左孩子,将该节点挂在到它的左孩子上,成为它的左孩子的右孩子
不再如图。
有代码:
inline void lrot(int &now)
{
int r = tr[now].r;
tr[now].r = tr[r].l;
tr[r].l = now;
now = r;
}//左旋
inline void rrot(int &now)
{
int l = tr[now].l;
tr[now].l = tr[l].r;
tr[l].r = now;
now = l;
}//右旋
树的双旋
1.一字型双旋(同构调整)
此种旋转是对一字型结构的:
一个节点和它的左孩子、它左孩子的左孩子
或者是 一个节点和它的右孩子、它右孩子的右孩子
如图:
或者它的镜像。
(1)对于上图的结构我们对根节点进行两次ZIG操作。(ZIG-ZIG)
1.对1进行ZIG
2.对2进行ZIG
得到:
第一步:
第二步:
(2)对于镜像的那种,我们同理有ZAG-ZAG操作。
1.之字型双旋(异构调整)
此种旋转是对之字型结构的:
一个节点和它的左孩子、它左孩子的右孩子
或者是 一个节点和它的右孩子、它右孩子的左孩子
同理有ZIG-ZAG、ZAG-ZIG两种操作。