演算法整理 複習 Splay

2021-10-17 03:30:50 字數 2962 閱讀 4301

一: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後面...