資料結構 Spaly Tree

2021-06-13 03:06:31 字數 2230 閱讀 9543

/******************************************

資料結構:

splay_tree,伸展樹;

性質:伸展樹是二叉查詢樹的一種改進;

與二叉查詢樹一樣,伸展樹也具有有序性;

即伸展樹中的每乙個節點x都滿足:

該節點左子樹中的每乙個元素都小於x;

而其右子樹中的每乙個元素都大於x;

與普通二叉查詢樹不同的是,伸展樹可以自我調整;

特點:伸展樹並不是嚴格意義上的平衡樹;

也還是極有可能退化成線性結構,但伸展操作能使它的每一次操作近似(logn);

伸展操作:

伸展操作和平衡樹的保持平衡是類似的;

只不過他不要求保持平衡,只是相應的旋轉;

旋轉有三種情況要處理:

(1)zig或zag(節點x的父節點y是根節點)

(2)zig-zig或zag-zag(節點x的父節點y不是根節點,且x與y同時是各自父節點的左孩子或者同時是各自父節點的右孩子)

(3)zig-zag或zag-zig(節點x的父節點y不是根節點,x與y中乙個是其父節點的左孩子而另乙個是其父節點的右孩子)

即一字型旋轉和之字型旋轉;

優勢:能快速定位乙個區間[l,r],並且能將區間進行刪除、旋轉操作;

將第l-1個結點旋轉至根(之前的splay操作),將第r+1個結點旋轉至根的右孩子;

由於伸展樹的本質還是二叉搜尋樹,則根據二叉查詢樹的性質可以知道;

在這兩個結點之間,也是根的右孩子的左子樹就包括節點[l,r];

即很快定位了區間[l,r],如果需要刪除,直接把子樹拿走即可;

演算法測試:

pku3468(a ****** problem with integers)

題目大意:

q a b :查詢區間[a,b]的和;

c a b x : 更新區間[a,b],區間所有值加上x;

*******************************************/

#include#include#include#includeusing namespace std;

#define key_value ch[ch[root][1]][0]//進行各種操作的區間

const int inf=0xffffff;

const int n=100010;

typedef long long ll;

int ch[n][2];//左右孩子(0為左孩子,1為右孩子)

int pre[n];//父結點

int key[n];//資料域

int size[n];//樹的規模

int val[n];

int add[n];

int a[n];//結點元素

ll sum[n];//子樹結點和

int root; //根結點

int tot;//結點數量

int n,q;

void push_up(int u)//通過孩子結點更新父結點

void push_down(int u)//將延遲標記更新到孩子結點

}void new_node(int &u,int f,int c)//新建乙個結點,f為父節點

void build_tree(int &u,int l,int r,int f)//建樹,中間結點先建立,然後分別對區間兩端在左右子樹建立

void rotate(int x,int c)//旋轉操作,c=0 表示左旋,c=1 表示右旋

pre[y]=x;

ch[x][c]=y;

push_up(y);

}void splay(int x,int f)//splay操作,把根結點x轉到結點f的下面

}push_up(x);// 最後再維護x結點

if(f==0)//更新根結點

}void rotate_under(int k,int f)//把第k位的數伸展到f下方

int get_pre(int x)//找前驅,即左子樹的最右結點

return key[x]-key[tmp];

}int get_next(int x)//找後繼,即右子樹的最左結點

return key[tmp]-key[x];

}ll query(int l,int r)//查詢[l,r]之間的和

void update(int l,int r)//更新

void init()//初始化

{ for(int i=0; i

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...

資料結構 01 資料與資料結構

1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...