treap 排序二叉樹的模板

2021-07-04 18:16:05 字數 3939 閱讀 2816



description

有乙個序列含有一定數量的元素,現在要求寫乙個程式,滿足以下幾個要求:

【a】支援插入操作(這個序列不允許有重複元素,即是說,如果待插入的元素已經出現在這個序列中,那麼請忽略此操作)

【b】支援刪除操作(如果此序列中不包含待刪除的這個元素,則忽略此操作,否則刪除這個元素)

【c】查詢元素x的前繼元素(前繼元素是指:小於x且與x最接近的元素,當然,如果x已經是序列中的最小元素,則x沒有前繼元素)

【d】查詢元素x的後繼元素(後繼元素是指:大於x且與x最接近的元素,當然,如果x已經是序列中的最大元素,則x沒有後繼元素)

【e】找第k小的元素

【f】求某個元素x的秩(即x的排名是多少,從小到大排序)

input

多組資料(整個檔案以輸入 -1 結束)

對於每組資料,有若干行(最多100000行),表示的意義如下:

【a】 insert x

【b】 delete x

【c】 predecessor x

【d】 successor x

【e】 kth x

【f】 rank x

這6種操作的意義與上面的定義相對應!

【g】 print 表示從小到大輸出序列中的所有元素

【h】 end 表示結束本組資料

每組輸入資料後有一空行!

output

對於以上8種操作,分別輸出對應資訊,如下:

【a】 insert x 不用輸出任何資訊

【b】 delete x 如果x存在,則刪除x,否則輸出 input error

【c】 predecessor x 如果x不存在,輸出 input error;否則如果x是序列中的最小元素,輸出對應資訊(見樣例),否則輸出x的前繼元素

【d】 successor x 如果x不存在,輸出 input error;否則如果x是序列中的最大元素,輸出對應資訊(見樣例),否則輸出x的後繼元素

【e】 kth x 如果x不合法,輸出 input error;否則輸出第kth小的元素(見樣例)

【f】 rank x 如果x不存在,輸出 input error;否則輸出x的排名(見樣例)

【g】 print 從小到大輸出序列中的所有元素,每個元素後加乙個逗號,並在最後加上 end of print(見樣例)

【h】 end 輸出 end of this test

insert 20

insert 5

insert 1

insert 15

insert 9

insert 25

insert 23

insert 30

insert 35

print

kth 0

kth 1

kth 3

kth 5

kth 7

kth 9

kth 10

rank 1

rank 3

rank 5

rank 15

rank 20

rank 30

rank 31

rank 35

successor 15

successor 35

successor 25

successor 26

predecessor 1

predecessor 20

predecessor 23

predecessor 15

predecessor 111

delete 9

delete 15

delete 25

delete 23

delete 20

print

kth 3

kth 4

rank 30

rank 35

end-1

1,5,9,15,20,23,25,30,35,end of print

input error

the 1_th element is 1

the 3_th element is 9

the 5_th element is 20

the 7_th element is 25

the 9_th element is 35

input error

the rank of 1 is 1_th

input error

the rank of 5 is 2_th

the rank of 15 is 4_th

the rank of 20 is 5_th

the rank of 30 is 8_th

input error

the rank of 35 is 9_th

the successor of 15 is 20

35 is the maximum

the successor of 25 is 30

input error

1 is the minimum

the predecessor of 20 is 15

the predecessor of 23 is 20

the predecessor of 15 is 9

input error

1,5,30,35,end of print

the 3_th element is 30

the 4_th element is 35

the rank of 30 is 3_th

the rank of 35 is 4_th

end of this test

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define nn 200005

#define inf 0x7ffff

struct treap

int compare(int x) const

};treap* root;

void rotate(treap* &t,int d)//旋轉

void insert(treap* &t,int x)//新增

t->maintain();

}void delete(treap* &t,int x)//刪除

else if(t->ch[1]==0)

else

}else delete(t->ch[d],x);

if(t!=0) t->maintain();

}bool find(treap *t,int x)//查詢

return false;

}int kth(treap *t,int k)//找第k小的元素

int rank(int x) //x的排名是多少,從小到大排序

else if(xkey)

p=p->ch[0];

else

}return ans;

}int depth(treap *t)

void print(treap *t)//列印樹,從小到大

int pre(int x)

p=p->ch[p->keykey>x)

p=p->ch[p->key<=x];

}if(****) return ans;

return inf;

}int main()

if(op[0]=='p'&&op[2]=='i')

else

else if(op[0]=='d')

else if(op[0]=='p'&&op[2]=='e')

{if(find(root,x))

{int y=pre(x);

if(y

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

二叉樹模板

最近學習的,關於二叉樹的建立,前中後序遍歷,和求二叉樹高等。include includetypedef struct node node typedef struct tree void preorder node node 先 前 序遍歷 根 左 右 void inorder node node...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...