一:zig
此時節點 u 是 root
v 是左孩子:右旋
v 是右孩子:左旋
二:zig_zig ( v , u 同側,先 u 再 v)
此時節點 u 不是 root
v 與 u 同為左孩子: 右旋兩次
v 與 u 同為右孩子: 左旋兩次
三:zig_zag ( v ,u 異側,先 v 再 u)
此時節點 u 不是 root
v 是左孩子,u 是右孩子:v 先右旋,再左旋
v 是右孩子,u 是左孩子:v 先左旋,再右旋
splay 的核心操作
struct nodetree[maxn]
;void
updata
(int x)
void
rotate
(int x)
void
splay
(int x,
int goal)
//將 x 旋轉為 goal 的兒子
rotate
(x);}if
(goal ==0)
}
平衡樹的基本操作,包括插入節點、刪除節點、查詢前驅後繼、找 k 大(小)值等等。
p3369 【模板】普通平衡樹
// find:
// 找到 x 所在的位置,轉到 root
/******************************************/
void
find
(int x)
while
(x!=tree[u]
.id && tree[u]
.son[x>tree[u]
.id]
)splay
(u,0);
}//前驅 & 後繼
// 先 find
// 前驅為左子樹最右點,後繼反之
intnext
(int x,
int k)
// k 為 0 時找前驅,為 1 時找後繼
u = tree[u]
.son[k]
;while
(tree[u]
.son[k^1]
)return u;
}void
insert
(int x)
if(u)
else
tree[u]
.id = x;
tree[u]
.fa = fa;
tree[u]
.son[1]
= tree[u]
.son[0]
=0; tree[u]
.cnt = tree[u]
.size =1;
splay
(tot,0)
;}}void
delete
(int x)
else
}int
kth(
int k)
while(1
)else
if(tree[ls]
.size >= k)
else}}
intsearch
(int x)
// x 的排名
intmain
(void
)//雖然不知道為什麼,但一定要先 insert 兩個最值,不然會 t
平衡樹的區間反轉
p3391 【模板】文藝平衡樹
#include
#include
using
namespace std;
#define maxn 100005
struct nodetree[maxn]
;int root, tot;
void
down
(int x)
}void
update
(int x)
void
rotate
(int x)
void
splay
(int x,
int goal)
rotate
(x);}if
(goal ==0)
}void
insert
(int x)
tree[
++tot]
.id = x;
tree[tot]
.fa = fa;
tree[tot]
.son[0]
= tree[tot]
.son[1]
=0; tree[tot]
.size =1;
if(fa)
splay
(tot,0)
;}intkth
(int k)
else
if(tree[tree[u]
.son[0]
].size >= k)
else}}
void
reverse
(int l,
int r)
void
print
(int u)
if(tree[u]
.id !=
-0x7fffffff
&& tree[u]
.id !=
0x7fffffff)if
(tree[u]
.son[1]
)}intmain
(void
)for
(int i=
1;i<=m;i++
)print
(root)
;return0;
}
返回
splay複習小記
splay的原名是伸展樹,一種超級實用的資料結構,能快速地乾很多資料結構不能幹的事情。很久以前就聽說過並且略微地學了一些,但是當時了解地並不是很多。有些人把splay達成spaly叫做死吧你,b 實質上他是乙個二叉搜尋樹,就是每個節點的左兒子在原序列中是在自己左邊的,右兒子在原序列中是在自己右邊的,...
splay模板複習
splay模板 記得加哨兵!include using namespace std pre def const double pi acos 1.0 const int inf 0x3f3f3f3f typedef long long ll typedef unsigned long long ul...
Splay演算法總結
splay是乙個功能強大的資料結構,可以實現一些平衡樹無法完成的操作 例題p3391 模板 文藝平衡樹 和平衡樹一樣,splay同樣也有左旋右旋的操作。並且splay中還有乙個核心操作,那就是將乙個節點移到另乙個節點下面,並保證整棵樹的中序遍歷不變。那麼很多操作就可以通過這兩個函式得出 比如在x後面...