時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3 描述
什麼是紅黑樹呢?顧名思義,跟棗樹類似,紅黑樹是一種葉子是黑色果子是紅色的樹。。。
當然,這個是我說的。。。
《演算法導論》上可不是這麼說的:
如果乙個二叉查詢樹滿足下面的紅黑性質,那麼則為乙個紅黑樹。
1)每個節點或是紅的,或者是黑的。
2)每個葉子節點(nil)是黑色的
3)如果乙個節點是紅色的,那麼他的兩個兒子都是黑的。
4)根節點是黑色的。
5)對於每個節點,從該節點到子孫節點的所有路徑上包含相同數目的黑色節點。
我們在整個過程中會用到這些性質,當然,為了公平起見,其實即使你不知道這些性質,這個題目也是可以完成的(為什麼不早說。。。。)。在紅黑樹的各種操作中,其核心操作被稱為旋轉,那麼什麼是旋轉呢,我們來看乙個例子:
假設我們這裡擷取紅黑樹的一部分,放在左邊,通過操作如果可以把他轉化為右邊的形式,那麼我們就稱將根為x的子樹進行了左旋,反之我們稱將根為y的樹進行了右旋:
恰好慢板同學把自己紅黑樹弄亂了,然後請你幫忙進行修復,他將向你描述他的紅黑樹(混亂的。。。)。然後告訴他需要用哪種方式旋轉某個節點。在你完成工作之後,直接向大黃提交新的樹的中序遍歷結果就好了。
hint:
在這裡好心的慢板同學給你簡單的解釋下樣例:
最開始的時候樹的樣子是這樣的:
0/ \
1 2
然後對於標號為0的節點進行右旋,結果將變為:1\
0\2然後呢。。。
中序遍歷?這個是什麼東西,哪個人可以告訴我下。。。。
輸入
輸入分兩部分:
第一部分:乙個整數t(1<=t<=10),表示測試的組數。
第二部分:第一行是乙個數字n,表示紅黑樹的節點個數。0
輸出每組測試返回n行數字,表示對樹的中序遍歷。在每組測試資料之後留一行空行。
樣例輸入
1樣例輸出30 1 2
1 -1 -1
2 -1 -1
10 1
1**02
鄭州大學校賽題目
分析:這是一道二叉樹的中序遍歷
#include#include#include#includeusing namespace std;
struct dot
;dot mp[120];
void midord(int x)
int main()
{ int n,a,b,m,t,c;
scanf("%d",&t);
while(t--)
{cin>>n;
for(int i=0;i
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...