對於bst,無壓力的可以,所以無需贅言,請見**。
1: program bst_kthfind(input,output);
2: type point=^node;
3: node=record
4: data,leftsum,rightsum:longint;
5: left,right:point;
6: end;
7: var ch:char;i,n,q:longint;flag:boolean;root:point;
8: procedure insert(var p:point;x:longint);
9: begin
10: if p=nilthen
11: begin
12: new(p);p^.data:=x;p^.right:=nil;p^.left:=nil;p^.rightsum:=0;p^.leftsum:=0;
13: if flag thenbegin root:=p;flag:=false;end;
14: endelse
15: if x>=p^.data then
16: begin
17: insert(p^.right,x);
18: inc(p^.rightsum);
19: end
20: elsebegin
21: insert(p^.left,x);
22: inc(p^.leftsum);
23: end;
24: end;
25: function find(p:point;x:longint):longint;
26: begin
27: if p^.leftsum=x-1 then exit(p^.data);
28: if p^.leftsum>x-1 then exit(find(p^.left,x));
29: if p^.leftsumthen exit(find(p^.right,x-p^.leftsum-1));
30: end;
31: begin
32: readln(n);root:=nil;flag:=true;
33: for i:=1 to n do
34: begin
35: read(ch);readln(q);
36: case ch of
37: 'i' : insert(root,q);
38: 'f' : writeln(find(root,q));
39: end;
40: end;
41: end.
另一種思路,是利用樹狀陣列。但這個東西侷限性很大,因為陣列c[i]表示的是比i這個數小的數的個數,也就是說出現了maxlongint大小的數字就無法處理了。大致思路如下
1: program problem1(input,output);
2: var c:array[0..300000]of longint;
3: n,i,tot,q:longint;ch:char;
4: function lowbit(x:longint):longint;
5: begin exit(x and -x);end;
6: procedure add(p:longint);
7: begin
8: while p<=300000 do
9: begin
10: inc(c[p]);
11: inc(p,lowbit(p));
12: end;
13: end;
14: function find_kth(x:longint):longint;
15: var i,ans,cnt:longint;
16: begin
17: ans:=0;cnt:=0;
18: for i:=19 downto 0 do
19: begin
20: inc(ans,1300000)or(cnt+c[ans]>=x)then dec(ans,1 23: end;24: exit(ans+1);25: end;26: begin27: readln(n);28: for i:=1 to n do29: begin30: read(ch);readln(q);31: case ch of32: 'i' : begin add(q);inc(tot);end;33: 'f' : writeln(find_kth(q));34: end;35: end;36: end.Data Structures(一)順序表
線性表 在資料元素的非空有限集合中,除第乙個元素無直接前驅 最後乙個元素無直接後繼,集合中其餘每個資料元素都有唯一直接前驅唯一直接後繼。線性表有順序儲存結構和鏈式儲存結構兩種儲存方式。含有大量型別相同記錄的線性表稱為檔案或資料物件。但是乙個線性表中的資料元素必須屬於同乙個資料物件。因此線性表中相鄰元...
Data Structures 資料結構基礎
用計算機解決乙個具體問題時,一般要經過下列幾個步驟 首先要從具體問題抽象出乙個適當的數學模型,然後設計乙個解此數學模型的演算法,最後編出程式 進行測試 調整直至得到最終解答。尋求數學模型的實質是分析問題 從中提取操作的物件,並找出這些操作物件之間含有的關係,這實際上就是分析資料結構。資料結構是研究非...
Data Structures 06 單鏈表面試題
獲取到單鏈表中的有效節點個數 不包括頭節點 public static intgetlength heronode head int length 0 heronode cur head.next while cur null return length 獲取到單鏈表中的有效節點個數 public ...