平衡樹的基本操作

2021-05-21 18:26:23 字數 3045 閱讀 1544

【題目名稱】:

2056 【2002湖南】營業額統計

【題目簡述】:

description

tiger

最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。

tiger

拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況

的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管

理學上定義了一種最小波動值來衡量這種情況:

該天的最小波動值

=min

當最小波動值越大時,就說明營業情況越不穩定。

而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助

tiger

來計算這乙個值。

第一天的最小波動值為第一天的營業額。

input

第一行為正整數

n(n<=32767)

,表示該公司從成立一直到現在的天數,接下來的

n行每行有乙個正整數

a(<=1000000)

,表示第

i天公司的營業額。

output

僅有乙個正整數,即每一天的最小波動值的總和。結果小於

2^31

sample input

6

5

1

2

5

4

6

sample output

12

hint

結果說明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

【題目考點】:

平衡樹的基本操作。包括有:1.

平衡樹的插入;2.

平衡樹中已知元素,求它是第幾小;3.

已知第幾小,求該元素

【題目分析】:

該題目是乙個所描述的問題是乙個經典的關於平衡樹的問題。對於輸入的每一天的營業額,必須在其前面已輸入的營業額中,找到與其最接近的營業額,即對於當前元素

ki,必須在其前面找到乙個元素kj(

1=),使的

|ki-kj|

最小,最後求出所有的

ki的值之和即為

answer

那麼,可以在輸入的同時,進行元素的插入以及元素的查詢,來尋找

min(

|ki-kj|

)。為了節省空間,本題可以用

1.指標

2.陣列模擬鄰接表

來做,具體方法如下:

【參考**】:

#include

using namespace std;

int n,ans;//

n表示一共的天數

struct node

*p;/*

指標的建立。

w是該位置的值,

pro為乙個隨機的

int數,用於維護堆的性質。

ln,rn

分別表示左孩子和右孩子的個數(都包括自身),

lc,rc

分別指向左右孩子

*/ void rturn(node *&a) //

右旋

void lturn(node *&a)//

左旋

/*左旋和右旋,是平衡樹和排序二叉樹的區別,用於維護堆的性質,來盡量提高時間效率。其操作實現是:將不滿足堆的性質的兩個元素進行交換,保證兒子的

pro比父親的要大。

*/ void charu(node *&p,int y)//

插入操作

if(yw)//as the left child

else//as the right child

}int chazhao(node *p,int y)//

第一種查詢操作,返回y

是第幾小的

}if(p==null) return 0;

else return k;

}int chazhao2(node *p,int x)//

第二種查詢操作,返回第x

小的元素是哪個

}return p->w;

}int main()

{int i,x,k;

ans=0;//

賦初值為

0 cin>>n;

for(i=1;i<=n;i++) //

迴圈輸入,邊輸入邊操作

{scanf("%d",&x);//

輸入每天的營業額

charu(p,x);//

進行插入

if(i==1) ans+=x; /*

剪枝操作

*/ else

{k=chazhao(p,x);//

樹的基本操作

輸入輸入某二叉樹的前序遍歷和中序遍歷的結果,請重構該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。例如,輸入前序遍歷序列和中序遍歷序列,重建該樹。樹的結點類如下 class treenode 通過前序遍歷獲取根節點的值,然後遍歷中序遍歷序列,找到根節點,將中序遍歷陣列分成左右兩個樹...

二叉平衡樹的旋轉操作

旋轉是很多二叉平衡樹維持平衡的主要手段,在這裡複習一下。其實旋轉過程中節點位置的變化只要遵循乙個原則就行了 比root小的在左子樹,比root大的在右子樹。當然這裡前提條件是左小右大 情況一 插入f節點導致失衡 這裡失衡的是a的左右子樹,很容易就可以想到旋轉b a鏈,值得注意的是e節點,它原先在b的...

樹的基本操作演算法

關於樹的一些基本操作,本來把自己的一些研究寫出來!方便大家學習!樹可以以陣列的形式存放,也可以以鍊錶的形式存放!根據程式不同的需要選擇不同的存放形式!陣列的操作比較簡單作有限!本文不做研究!本文只是對鏈式儲存,做了一些簡單的研究!樹的鍊錶形式 struct node2 也可以是 struct nod...