建立一顆敗者樹

2021-09-11 01:52:17 字數 2360 閱讀 9132

敗者樹是電腦科學學科裡的一種資料結構。可用於外部排序中提高效率。敗者樹實際上是一棵完全二叉樹,可以看做是勝者樹的一種變體。敗者樹簡化了重構。敗者樹的重構只是與該結點的父結點的記錄有關,而勝者樹的重構還與該結點的兄弟結點有關。敗者樹中每個葉子結點存放各歸併段在歸併過程中當前參加比較的記錄,每個非葉子結點記憶其兩個子女結點中記錄排序碼小的結點(即敗者)。

注意,敗者樹的重構跟勝者樹是不一樣的,敗者樹的重構只需要與其父結點比較。

b3與結點ls[4]的原值比較,ls[4]中存放的原值是結點4,即b3與b4比較,b3負b4勝,則修改ls[4]的值為結點3。同理,以此類推,沿著根結點不斷比賽,直至結束。

敗者樹重構過程如下:

將新進入選擇樹的結點與其父結點進行比賽:將敗者存放在父結點中;而勝者再與上一級的父結點比較。

比賽沿著到根結點的路徑不斷進行,直到ls[1]處。把敗者存放在結點ls[1]中,勝者存放在ls[0]中。

/***    實驗題目:

*        建立一顆敗者樹(數值小的勝出)

*    實驗目的:

*        領會外排序中敗者樹的建立過程和演算法設計

*    實驗內容:

*        編寫程式,給定關鍵字序列(17, 5, 10, 29, 15),採用5路歸併,

*    建立對應的一顆敗者樹,並輸出構建過程。

*    備註:

*        敗者樹ls的結點型別loser_tree即為關鍵字型別key_type,對於k路歸併,

*    敗者樹有乙個冠軍結點ls[0](存放最小的數值)和ls[1]~ls[k-1]的分支結點,

*    另外加上b[0]~b[k-1]的葉子結點,b陣列設定為全域性變數。

*/#include

#define k   5                                   //  5路平衡歸併

#define min_key -32768                          //  最小關鍵字值-∞

typedef int key_type;

typedef key_type loser_tree;

key_type b[k];                                  //  b中存放所有的記錄(關鍵字)

int cnt = 1;                                    //  全域性變數

/*-------------沿從葉子結點b[s]到根結點ls[0]的路徑調整敗者樹---------------*/

static void adjust(loser_tree ls[k], int s)

t = t / 2;                              //  繼續向上調整

}ls[0] = s;                                  //  冠軍結點存放最小者

}/*---------------------輸出敗者樹----------------------*/

static void disp_loser_tree(loser_tree ls[k])

printf("\n");

}/*---------------------建立敗者樹----------------------*/

static void create_loser_tree(loser_tree ls[k])

}int main(void)

;printf("%d路歸併的關鍵字序列:", k);

for(int i = 0; i < n; i++)

printf("\n");

create_loser_tree(ls);

printf("最終結果\n");

disp_loser_tree(ls);

return 0;

}測試結果:

5路歸併的關鍵字序列:17 5 10 29 15

第1步,從b[4]=15調整->敗者樹:5(-∞) 5(-∞) 5(-∞) 5(-∞) 4(15)

第2步,從b[3]=29調整->敗者樹:5(-∞) 5(-∞) 4(15) 5(-∞) 3(29)

第3步,從b[2]=10調整->敗者樹:5(-∞) 5(-∞) 4(15) 2(10) 3(29)

第4步,從b[1]= 5調整->敗者樹:5(-∞) 1(5) 4(15) 2(10) 3(29)

第5步,從b[0]=17調整->敗者樹:1(5) 4(15) 0(17) 2(10) 3(29)

最終結果

敗者樹:1(5) 4(15) 0(17) 2(10) 3(29)

建立一顆多叉樹

多叉樹的建立是很複雜的,因為分支數目不確定,但是我們可以知道多叉樹和二叉樹其實是可以轉化的,我們可以將其轉化為二叉樹。下面就是使用 子女 兄弟鏈法 建立的一顆樹。pragma once includeusing namespace std templateclass tree templatecla...

製作一顆選單樹

從三個表中取得資料,生成一顆選單樹 樹的根是乙個城市名稱,它的子節點是這個城市的各個行政區,行政區的子節點為該行政區中的機構,機構的子節點為改機構中的工作人員。了解了這顆樹的結構後,腦海裡已經浮現出這顆樹的樣式了吧 簡單描述一下表 行政區 district 機構 organization 人員 us...

另一顆樹的子樹

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的乙個子樹包括 s 的乙個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。解題思路 先從跟結點開始,看兩顆樹的根節點是否相同,然後遞迴遍歷兩棵樹的左右子樹,如果都相同返回true 否則讓樹s左右子樹...