锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 2銆丅-鏍?wèi)鏁版嵁缁撴?/font> 2銆丅鏍?wèi)鐨勬煡鎵? 3銆丅鏍?wèi)鐨勬彃鍏? 銆銆(a)鍋囪緇撶偣p涓凡緇忓惈鏈塵-1涓叧閿瓧錛屽啀鎻掑叆涓涓叧閿瓧涔嬪悗(鎻掑叆鎬昏淇濇寔鍏抽敭瀛楁暟緇勭殑澶у皬鏈夊簭錛屼粠灝忓埌澶ф帓濂藉簭)錛屽彲浠ュ皢p鍒嗚涓簆鍜宲’錛屽叾涓璸鍚湁鐨勪俊鎭負(fù)[m/2]-1([m]琛ㄧず澶т簬m鐨勬渶灝忔暣鏁?錛宲’鍚湁鐨勪俊鎭負(fù)m-[m/2] ([m]琛ㄧず澶т簬m鐨勬渶灝忔暣鏁?銆傜劧鍚庡皢鍏抽敭瀛桲[m/2]鍜屾寚鍚憄’鐨勬寚閽堝垯涓璧鋒彃鍏ュ埌p鐨勫弻浜茬粨鐐逛腑鍘匯?
銆銆(b)媯鏌ュ弻浜茬粨鐐癸紝濡傛灉鍙屼翰緇撶偣鍑虹幇(a)鐨勬儏鍐碉紝鍒欏洖鍒版楠緇х畫鎵ц銆傜洿鍒版彃鍏ユ弧瓚蟲潯浠朵負(fù)姝紝鏍?wèi)鐨勬繁搴﹀鍔牁q囩▼鏄殢鐫鎻掑叆鑰岃嚜涓嬭屼笂鐢熼暱鐨勮繃紼嬨?br /> 涓嬪浘鏄劇ず浜嗗湪B鏍?wèi)涓彃鍏ュ叧閿?3鐨勮繃紼嬨? 4銆丅鏍?wèi)鐨勫垹闄? 銆銆1.鏈塶媯靛瓙鏍?wèi)鐨劸l撶偣涓惈鏈塶涓叧閿瓧銆? 銆銆2.鎵鏈夌殑鍙跺瓙緇撶偣涓寘鍚簡鍏ㄩ儴鍏抽敭瀛楃殑淇℃伅錛屽強(qiáng)鎸囧悜鍚繖浜涘叧閿瓧璁板綍鐨勬寚閽堬紝涓斿彾瀛愮粨鐐規(guī)湰韜緷鍏抽敭瀛楃殑澶у皬鑷皬鑰屽ぇ欏哄簭閾炬帴銆? 銆銆3.鎵鏈夌殑闈炵粓绔粨鐐瑰彲浠ョ湅鎴愭槸绱㈠紩閮ㄥ垎錛岀粨鐐逛腑浠呭惈鍏跺瓙鏍?wèi)锛堟牴缁撶偣锛変腑鐨勬渶澶э紙鎴栨渶灝忥級鍏抽敭瀛椼? 銆銆閫氬父鍦˙+鏍?wèi)涓婃湁涓や釜澶存寚閽堝Q屼竴涓寚鍚戞牴緇撶偣錛屼竴涓寚鍚戝叧閿瓧鏈灝忕殑鍙跺瓙緇撶偣銆?br /> 銆銆瀵笲+鏍?wèi)鍙互杩涜涓たU嶆煡鎵捐繍綆楋細(xì) 銆銆1.浠庢渶灝忓叧閿瓧璧烽『搴忔煡鎵撅紱 銆銆2.浠庢牴緇撶偣寮濮嬶紝榪涜闅忔満鏌ユ壘銆? 銆銆鍦ㄦ煡鎵炬椂錛岃嫢闈炵粓绔粨鐐逛笂鐨勫墽緇勬満絳変簬緇欏畾鍊鹼紝騫朵笉緇堟錛岃屾槸緇х畫鍚戜笅鐩村埌鍙跺瓙緇撶偣銆傚洜姝わ紝鍦˙+鏍?wèi)涓Q屼笉綆℃煡鎵炬垚鍔熶笌鍚︼紝姣忔鏌ユ壘閮芥槸璧頒簡涓鏉′粠鏍瑰埌鍙跺瓙緇撶偣鐨勮礬寰勩傚叾浣欏悓B-鏍?wèi)鐨勬煡鎵揪c諱技銆? 銆銆m闃禕鏍?wèi)鐨勬彃鍏ユ搷浣滃湪鍙跺瓙缁撶偣涓姌q涜錛屽亣璁捐鎻掑叆鍏抽敭鍊糰錛屾壘鍒板彾瀛愮粨鐐瑰悗鎻掑叆a錛屽仛濡備笅綆楁硶鍒ゅ埆錛? 銆銆①濡傛灉褰撳墠緇撶偣鏄牴緇撶偣騫朵笖鎻掑叆鍚庣粨鐐瑰叧閿瓧鏁扮洰灝忎簬絳変簬m錛屽垯綆楁硶緇撴潫錛? 銆銆②濡傛灉褰撳墠緇撶偣鏄潪鏍圭粨鐐瑰茍涓旀彃鍏ュ悗緇撶偣鍏抽敭瀛楁暟鐩皬浜庣瓑浜巑錛屽垯鍒ゆ柇鑻鏄柊绱㈠紩鍊兼椂杞楠?#9315;鍚庣粨鏉燂紝鑻涓嶆槸鏂扮儲寮曞煎垯鐩存帴緇撴潫錛? 銆銆③濡傛灉鎻掑叆鍚庡叧閿瓧鏁扮洰澶т簬m(闃舵暟)錛屽垯緇撶偣鍏堝垎瑁傛垚涓や釜緇撶偣X鍜孻錛屽茍涓斾粬浠悇鑷墍鍚殑鍏抽敭瀛椾釜鏁板垎鍒負(fù)錛歶=澶т簬(m+1)/2鐨勬渶灝忔暣鏁幫紝v=灝忎簬(m+1)/2鐨勬渶澶ф暣鏁幫紱 銆銆鐢變簬绱㈠紩鍊間綅浜庣粨鐐圭殑鏈宸︾鎴栬呮渶鍙崇錛屼笉濡ㄥ亣璁劇儲寮曞間綅浜庣粨鐐規(guī)渶鍙崇錛屾湁濡備笅鎿嶄綔錛? 銆銆濡傛灉褰撳墠鍒嗚鎴愮殑X鍜孻緇撶偣鍘熸潵鎵灞炵殑緇撶偣鏄牴緇撶偣錛屽垯浠嶺鍜孻涓彇鍑虹儲寮曠殑鍏抽敭瀛楋紝灝嗚繖涓や釜鍏抽敭瀛楃粍鎴愭柊鐨勬牴緇撶偣錛屽茍涓旇繖涓牴緇撶偣鎸囧悜X鍜孻錛岀畻娉曠粨鏉燂紱 銆銆濡傛灉褰撳墠鍒嗚鎴愮殑X鍜孻緇撶偣鍘熸潵鎵灞炵殑緇撶偣鏄潪鏍圭粨鐐癸紝渚濇嵁鍋囪鏉′歡鍒ゆ柇錛屽鏋渁鎴愪負(fù)Y鐨勬柊绱㈠紩鍊鹼紝鍒欒漿姝ラ④寰楀埌Y鐨勫弻浜茬粨鐐筆錛屽鏋渁涓嶆槸Y緇撶偣鐨勬柊绱㈠紩鍊鹼紝鍒欐眰鍑篨鍜孻緇撶偣鐨勫弻浜茬粨鐐筆錛涚劧鍚庢彁鍙朮緇撶偣涓殑鏂扮儲寮曞糰’錛屽湪P涓彃鍏ュ叧閿瓧a’錛屼粠P寮濮嬶紝緇х畫榪涜鎻掑叆綆楁硶錛? 銆銆④鎻愬彇緇撶偣鍘熸潵鐨勭儲寮曞糱錛岃嚜欏跺悜涓嬶紝鍏堝垽鏂牴鏄惁鍚湁b錛屾槸鍒欓渶瑕佸厛灝哹鏇挎崲涓篴錛岀劧鍚庝粠鏍圭粨鐐瑰紑濮嬶紝璁板綍緇撶偣鍦板潃P錛屽垽鏂璓鐨勫瀛愭槸鍚﹀惈鏈夌儲寮曞糱鑰屼笉鍚湁绱㈠紩鍊糰錛屾槸鍒欏厛灝嗗瀛愮粨鐐逛腑鐨刡鏇挎崲涓篴錛岀劧鍚庡皢P鐨勫瀛愮殑鍦板潃璧嬪肩粰P錛岀戶緇悳绱紝鐩村埌鍙戠幇P鐨勫瀛愪腑宸茬粡鍚湁a鍊兼椂錛屽仠姝㈡悳绱紝榪斿洖鍦板潃P銆? 銆銆B+鏍?wèi)鐨勫垹闄や篃浠呭湪鍙跺瓙缁撶偣杩涜锛屽綋鍙跺瓙缁撶偣涓殑鏈澶у叧閿瓧琚垹闄ゆ椂錛屽叾鍦ㄩ潪緇堢緇撶偣涓殑鍊煎彲浠ヤ綔涓轟竴涓?#8220;鍒嗙晫鍏抽敭瀛?#8221;瀛樺湪銆傝嫢鍥犲垹闄よ屼嬌緇撶偣涓叧閿瓧鐨勪釜鏁板皯浜巑/2 錛坢/2緇撴灉鍙?a target="_blank">涓婄晫錛屽5/2緇撴灉涓?錛夋椂錛屽叾鍜屽厔寮熺粨鐐圭殑鍚堝茍榪囩▼浜﹀拰B-鏍?wèi)绫讳脊{? 銆銆鍙﹀鐨勭湅娉曪紝褰撲綔琛ュ厖鍜屼赴瀵屽惂銆侭鏍?wèi)锛孊-鏍?wèi)鍜孊+鏍?wèi)鏄笁涓笉鍚岀殑姒傚奎c(diǎn)?br /> 銆銆浜屽弶鎺掑簭鏍?wèi)锛圔inary Sort Tree錛夊張縐頒簩鍙夋煡鎵炬爲(wèi)錛屼篃鍙獴鏍?wèi)銆? 銆銆瀹冩垨鑰呮槸涓媯電┖鏍?wèi)锛涙垨鑰呮槸鍏鋒湁涓嬪垪鎬ц川鐨勪簩鍙夋爲(wèi)錛? 銆銆(1)鑻ュ乏瀛愭爲(wèi)涓嶇┖錛屽垯宸﹀瓙鏍?wèi)涓婃墍鏈夌粨鐐圭殑鍊煎潎灝忎簬宸﹀瓙鏍?wèi)鎵鍦ㄦ爲(wèi)鐨勬牴緇撶偣鐨勫鹼紱 銆銆(2)鑻ュ彸瀛愭爲(wèi)涓嶇┖錛屽垯鍙沖瓙鏍?wèi)涓婃墍鏈夌粨鐐圭殑鍊煎潎澶т簬鍙沖瓙鏍?wèi)鎵鍦ㄦ爲(wèi)鐨勬牴緇撶偣鐨勫鹼紱 銆銆(3)宸︺佸彸瀛愭爲(wèi)涔熷垎鍒負(fù)浜屽弶鎺掑簭鏍?wèi)锛? 銆銆鏃墮棿澶嶆潅搴︿笌鏍?wèi)鐨勬繁搴︾殑鏈夊厽雬? 銆銆姝ラ錛氳嫢鏍圭粨鐐圭殑鍏抽敭瀛楀肩瓑浜庢煡鎵劇殑鍏抽敭瀛楋紝鎴愬姛銆? 銆銆鍚﹀垯錛氳嫢灝忎簬鏍圭粨鐐圭殑鍏抽敭瀛楀鹼紝閫掑綊鏌ュ乏瀛愭爲(wèi)銆? 銆銆鑻ュぇ浜庢牴緇撶偣鐨勫叧閿瓧鍊鹼紝閫掑綊鏌ュ彸瀛愭爲(wèi)銆? 銆銆鑻ュ瓙鏍?wèi)湄?fù)絀猴紝鏌ユ壘涓嶆垚鍔熴? 銆銆浜屽弶鎺掑簭鏍?wèi)鏄竴縐嶅姩鎬佹爲(wèi)琛ㄣ傚叾鐗圭偣鏄細(xì)鏍?wèi)鐨劸l撴瀯閫氬父涓嶆槸涓嬈$敓鎴愮殑錛岃屾槸鍦ㄦ煡鎵捐繃紼嬩腑錛屽綋鏍?wèi)涓笉瀛樺湪鍏抽敭瀛椊{変簬緇欏畾鍊肩殑鑺傜偣鏃跺啀榪涜鎻掑叆銆傛柊鎻掑叆鐨勭粨鐐逛竴瀹氭槸涓涓柊娣誨姞鐨勫彾瀛愯妭鐐癸紝騫朵笖鏄煡鎵句笉鎴愬姛鏃舵煡鎵捐礬寰勪笂璁塊棶鐨勬渶鍚庝竴涓粨鐐圭殑宸﹀瀛愭垨鍙沖瀛愮粨鐐廣? 銆銆鎻掑叆綆楁硶錛? 銆銆棣栧厛鎵ц鏌ユ壘綆楁硶錛屾壘鍑鴻鎻掔粨鐐圭殑鐖朵翰緇撶偣銆? 銆銆鍒ゆ柇琚彃緇撶偣鏄叾鐖朵翰緇撶偣鐨勫乏鍎垮瓙榪樻槸鍙沖効瀛愩傚皢琚彃緇撶偣浣滀負(fù)鍙跺瓙緇撶偣鎻掑叆銆? 銆銆鑻ヤ簩鍙夋爲(wèi)涓虹┖銆傚垯棣栧厛鍗曠嫭鐢熸垚鏍圭粨鐐廣? 銆銆娉ㄦ剰錛氭柊鎻掑叆鐨勭粨鐐規(guī)繪槸鍙跺瓙緇撶偣錛屾墍浠ョ畻娉曞鏉傚害鏄疧(h)銆? 銆銆鍒犻櫎綆楁硶錛? 銆銆濡傛灉鍒犻櫎鐨勭粨鐐規(guī)病鏈夊瀛愶紝鍒欏垹闄ゅ悗綆楁硶緇撴潫錛? 銆銆濡傛灉鍒犻櫎鐨勭粨鐐瑰彧鏈変竴涓瀛愶紝鍒欏垹闄ゅ悗璇ュ瀛愬彇浠h鍒犻櫎緇撶偣鐨勪綅緗紱 銆銆濡傛灉鍒犻櫎鐨勭粨鐐規(guī)湁涓や釜瀛╁瓙錛屽垯閫夋嫨鍙沖瀛愪負(fù)鏍圭殑鏍?wèi)锛屽畠鐨勫乏瀛愭爲(wèi)涓Q屽兼渶灝忕殑鐐逛綔涓烘柊鐨勬牴錛屽悓鏃跺湪璇ユ渶灝忓煎寮濮嬶紝鎵ц鍒犻櫎綆楁硶錛屽姝ょ戶緇埌鍒犻櫎綆楁硶鐨勫墠涓ょ鎯呭喌鏃訛紝鍒犻櫎綆楁硶緇撴潫銆? 銆銆B鏍?wèi)鐢ㄩ旓細(xì)鏌ユ壘淇℃伅蹇燂紝浣嗘槸闅忕潃鏌ユ壘娣卞害鐨勫鍔狅紝浼?xì)濯勫搷鏌ユ墑勬晥鐜囧Q屾墍浠ワ紝閫氬父浼?xì)鋴社敤邈^琛′簩鍙夋爲(wèi)鐨勫鉤琛$畻娉曟潵榪涜鍔ㄦ佸鉤琛°?/p>
銆銆璁懼畾涓や釜鎸囬拡錛屾渶鍒濅綅緗垎鍒負(fù)涓や釜宸茬粡鎺掑簭搴忓垪鐨勮搗濮嬩綅緗?
銆銆姣旇緝涓や釜鎸囬拡鎵鎸囧悜鐨勫厓绱狅紝閫夋嫨鐩稿灝忕殑鍏冪礌鏀懼叆鍒板悎騫剁┖闂達(dá)紝騫剁Щ鍔ㄦ寚閽堝埌涓嬩竴浣嶇疆
銆銆閲嶅姝ラ3鐩村埌鏌愪竴鎸囬拡杈懼埌搴忓垪灝? 闃呰鍏ㄦ枃
]]>
#define M 4 //B-鏍?wèi)鐨勯樣灱屾殏璁句?
#define false 0
#define true 1
typedef struct BTNode
{
int keynum; //鑺傜偣涓叧閿瓧涓暟錛屽嵆鑺傜偣鐨勫ぇ灝?/span>
struct BTNode *parent; //鎸囧悜鍙屼翰緇撶偣
int key[M+1]; //鍏抽敭瀛楀悜閲忥紝0鍙峰崟鍏冩湭鐢?/span>
struct BTNode *son[M+1]; //瀛愭爲(wèi)鎸囬拡鍚戦噺
//Record *recptr[M+1]; //璁板綍鎸囬拡鍚戦噺錛?鍙峰崟鍏冩湭鐢?鏂囦歡涓嬌鐢?
}BTNode, *BTree; //B-鏍?wèi)鑺傜偣鍜孊-鏍?wèi)鐨劸c誨瀷
typedef struct
{
BTNode *pt; //鎸囧悜鎵懼埌鐨勮妭鐐?/span>
int pos; //1...m,鍦ㄨ妭鐐逛腑鐨勫叧閿瓧搴忓彿
int tag; //1:鏌ユ壘鎴愬姛錛?:鏌ユ壘澶辮觸
}Result; //B-鏍?wèi)鐨勬煡鎵揪l撴灉綾誨瀷
//鍒濆鍖?/span>
void init_BTree(BTree &root)
{
root=NULL;
}
B鏍?wèi)涓婄殑鏌ユ壘鏄竴涓『鎸囬拡鏌ユ壘緇撶偣鍜屽湪緇撶偣鍐呯殑鍏抽敭鐮佷腑鏌ユ壘浜ゅ弶榪涜鐨勮繃紼嬨?span style="color: red">浠庢牴緇撶偣寮濮?/span>錛屽湪緇撶偣鍖呭惈鐨勫叧閿爜涓煡鎵劇粰瀹氱殑鍏抽敭鐮侊紝鎵懼埌鍒欐煡鎵炬垚鍔燂紱鍚﹀垯紜畾緇欏畾鍏抽敭鐮佸彲鑳藉湪鐨勫瓙鏍?wèi)锛岄噸澶嶄笂闈㈢殑鎿嶄綔锛岀洿鍒版煡鎵炬垚鍔熸垨鑰呮寚閽堜負(fù)絀轟負(fù)姝€?
涓嬪浘鏄劇ず浜嗗湪B鏍?wèi)涓煡鎵惧叧閿?1鐨勮繃紼嬨?

{
int j;
for(j=1; j<=p->keynum; j++)
if(p->key[j] > key)
{
break;
}
return j-1; //搴旇鎻掑叆鐨勪綅緗殑鍓嶄竴浣?/span>
}
Result searchBtree(BTree &root, int key)
{
//鍦╩闃禕鏍?wèi)t涓婃煡鎵懼叧閿爜key錛屽弽鍥?pt,i,tag)銆?br /> //鑻ユ煡鎵炬垚鍔燂紝鍒欑壒寰佸紅ag=1錛屾寚閽坧t鎵鎸囩粨鐐逛腑絎琲涓叧閿爜絳変簬key錛?br /> //鍚﹀垯錛岀壒寰佸紅ag=0,絳変簬key鐨勫叧閿爜璁板綍,搴旀彃鍏ュ湪鎸囬拡pt鎵鎸囩粨鐐逛腑絎琲涓拰絎琲+1涓叧閿爜涔嬮棿
int found=false;
int i;
BTree p=root,father=NULL; //鍒濆鍖栵紝p鎸囧悜寰呮煡鑺傜偣錛宷鎸囧悜p鐨勫弻浜?/span>
Result result; //SearchBTree鍑芥暟榪斿洖鍊?/span>
while(p && !found)
{
i=search(p,key); //p->node[i].key≤K<p->node[i+1].key
if(i>0 && p->key[i]==key)
{
found=true; //鎵懼埌寰呮煡鍏抽敭瀛?/span>
}
else
{
father=p;
p=p->son[i];
}
}
result.pos=i+1; //pos鏄彃鍏ョ殑浣嶇疆,璁頒綇鍔?
if(found) //鏌ユ壘鎴愬姛
{
result.pt=p;
result.tag=1;
}
else //鏌ユ壘涓嶆垚鍔燂紝榪斿洖key鐨勬彃鍏ヤ綅緗甶
{
result.pt=father;
result.tag=0;
}
return result;
}//SearchBTree
棣栧厛鏄湪鎭板綋鐨勫彾瀛愮粨鐐逛腑娣誨姞鍏抽敭鐮侊紝濡傛灉璇ョ粨鐐逛腑鍏抽敭鐮佷笉瓚呰繃m-1涓紝鍒欐彃鍏ユ垚鍔熴傚惁鍒欒鎶婅繖涓粨鐐瑰垎瑁備負(fù)涓や釜銆傚茍鎶婁腑闂寸殑涓涓叧閿爜鎷垮嚭鏉ユ彃鍒扮粨鐐圭殑鐖剁粨鐐歸噷鍘匯傜埗緇撶偣涔熷彲鑳芥槸婊$殑錛屽氨闇瑕佸啀鍒嗚錛屽啀寰涓婃彃銆傛渶鍧忕殑鎯呭喌錛岃繖涓繃紼嬪彲鑳戒竴鐩翠紶鍒版牴錛屽鏋滈渶瑕佸垎瑁傛牴錛岀敱浜庢牴鏄病鏈夌埗緇撶偣鐨勶紝榪欐椂灝卞緩绔嬩竴涓柊鐨勬牴緇撶偣銆傛彃鍏ュ彲鑳藉鑷碆鏍?wèi)鏈濈潃鏍圭殑鏂瑰悜鐢熼暱銆?nbsp;
B-鏍?wèi)鐨勭敓鎴愪粠绌烘爲(wèi)寮濮嬶紝閫愪釜鎻掑叆鍏抽敭瀛楄屽緱銆傚叧閿瓧鐨勪釜鏁板繀欏昏嚦灝戜負(fù)[m/2]-1錛屾瘡嬈℃彃鍏ユ誨湪鏈搴曞眰鏌愪釜緇堢緇撶偣娣誨姞涓涓叧閿瓧錛屽鏋滆緇撶偣鍏抽敭瀛椾釜鏁板皬浜巑-1鍒欑洿鎺ユ彃鍏ワ紝濡傛灉鍙戠幇鏂版彃鍏ュ叧閿瓧鍚庯紝鍏抽敭瀛楁繪暟瓚呰繃m-1涓垯緇撶偣闇瑕佸垎瑁傦紝鍋氭硶濡備笅錛?

void split(BTree &q, int s, BTree &ap)
{
// 灝嗙粨鐐筿鍒嗚鎴愪袱涓粨鐐癸紝鍓嶄竴鍗婁繚鐣欙紝鍚庝竴鍗婄Щ鍏ユ柊鐢熺粨鐐筧p
int i;
cout<<"鍒嗚!"<<" "<<q->key[s]<<endl;
ap=(BTree)malloc(sizeof(BTNode)); //鐢熸垚鏂扮粨鐐筧p
ap->son[0] = q->son[s]; //鍘熸潵緇撶偣涓棿浣嶇疆鍏抽敭瀛楃浉搴旀寚閽堟寚鍚戠殑瀛愭爲(wèi)鏀懼埌鏂扮敓鎴愮粨鐐圭殑0媯靛瓙鏍?wèi)涓?/span>
for(i=s+1;i<=M;i++) //鍚庝竴鍗婄Щ鍏p
{
ap->key[i-s]=q->key[i];
ap->son[i-s]=q->son[i];
}//for
ap->keynum=M-s;
ap->parent=q->parent;
q->keynum=s-1; //q鐨勫墠涓鍗婁繚鐣欙紝淇敼keynum
}//split
void NewRoot(BTree &root, int x, BTree &ap) //鐢熸垚鏂扮殑鏍硅妭鐐?/span>
{
//鐢熸垚鍚俊鎭?root,r,ap)鐨勬柊鐨勬牴緇撶偣*root錛屽師root鍜宎p涓哄瓙鏍?wèi)鎸囬?/span>
BTree p;
p=(BTree)malloc(sizeof(BTNode));
if(root) //濡傛灉鍘熸潵鐨勬爲(wèi)涓嶆槸絀烘爲(wèi)
root->parent=p; //榪滄潵鐨勬牴鐨勫弻浜叉寚閽堟寚鍚戞柊鏍?/span>
p->son[0]=root; //鏂版牴鐨勭涓涓瀛愯妭鐐規(guī)槸鍘熸潵鐨勬牴鑺傜偣
root=p; //root鎸囧悜鏂版牴
root->parent=NULL; //鏂版牴鐨勫弻浜叉槸絀烘寚閽?/span>
root->keynum=1;
root->key[1]=x; //鏂版牴鐨勭涓涓叧閿瓧灝辨槸鍓嶉潰鍒嗚鍑烘潵鐨勫叧閿瓧
root->son[1]=ap; //鏂版牴鐨勭浜屼釜瀛╁瓙鑺傜偣鏄師鏉ョ殑鏍逛腑鍒嗚鍑烘潵鐨勮妭鐐?/span>
if(ap) //濡傛灉鍘熸潵鐨勬爲(wèi)涓嶆槸絀烘爲(wèi)
ap->parent=root; //鍘熸潵鐨勬牴涓垎瑁傚嚭鏉ョ殑鑺傜偣鐨勫弻浜叉寚閽堟寚鍚戞柊鏍?/span>
}//NewRoot
void insert(BTree &q, int i, int key, BTree &ap) //鎻掑叆
{
int j;
for(j=q->keynum; j>=i; j--)
{
q->key[j+1]=q->key[j];
}
q->key[i]=key;
for(j=q->keynum; j>=i; j--)
{
q->son[j+1]=q->son[j];
}
q->son[i]=ap;
q->keynum++;
}//insert
void insertBtree(BTree &root, int key, BTree &q, int i)
{
//鍦˙-鏍?wèi)T涓婅妭鐐筿鐨刱ey[i]鍜宬ey[i+1]涔嬮棿鎻掑叆鍏抽敭瀛梜ey
//鑻ュ紩璧瘋妭鐐硅繃澶э紝鍒欐部鍙屼翰閾捐繘琛屽繀瑕佺殑鑺傜偣鍒嗚鏁寸悊錛屼嬌T浠嶆槸M闃剁殑B-鏍?/span>
BTree ap=NULL;
int x=key;
int finished = false;
int s;
while(q && !finished)
{
insert(q, i, x, ap); //灝唊ey鍜宎p鍒嗗埆鎻掑叆鍒皅->key[i+1]鍜宷->son[i+1]
if(q->keynum < M)
finished = true; //鎻掑叆瀹屾垚
else
{ //鍒嗚緇撶偣*q
s=ceil(M/2);
x=q->key[s];
split(q, s, ap); //灝唓->key[s+1...M],q->son[s...M]鍜宷->recptr[s+1...M]縐誨叆鍒版柊鑺傜偣*ap
q=q->parent;
if(q)
i=search(q,x)+1; //鍦ㄥ弻浜茬粨鐐?q涓幓鏌ユ壘x鐨勬彃鍏ヤ綅緗?璁頒綇鍔?錛屽洜涓簊earch()榪斿洖鐨勬槸鎻掑叆浣嶇疆鐨勫墠涓浣?/span>
}//else
}//while
if(!finished) //root鏄┖鏍?鍙傛暟q鍒濆間負(fù)NULL)鎴栬呮牴鑺傜偣宸插垎瑁備負(fù)鑺傜偣*q鍜?ap
NewRoot(root, x, ap); //鐢熸垚鍚俊鎭?root,x,ap)鐨勬柊鐨勬牴鑺傜偣*root錛屽師root鍜宎p涓哄瓙鏍?wèi)鎸囬?/span>
}//insertBtree
void SearchInsertBTree(BTree &root,int key)//鎼滅儲鎻掑叆
{
//鍦╩闃禕鏍?t涓婄粨鐐?q鐨刱ey[i],key[i+1]涔嬮棿鎻掑叆鍏抽敭鐮乲ey
//鑻ュ紩璧風(fēng)粨鐐硅繃澶э紝鍒欐部鍙屼翰閾捐繘琛屽繀瑕佺殑緇撶偣鍒嗚璋冩暣錛屼嬌*t浠嶄負(fù)m闃禕鏍?/span>
Result rs;
rs = searchBtree(root,key);
if(!rs.tag) //tag=0鏌ユ壘涓嶆垚鍔燂紝鎻掑叆
{
cout<<"鏍?wèi)涓病鏈夌浉鍚岀殑鑺傜偣锛屾彃鍏?"<<endl;
insertBtree(root, key, rs.pt, rs.pos); //鍦˙-鏍?wèi)T涓婅妭鐐箁e.pt鐨刱ey[i]鍜宬ey[i+1]涔嬮棿鎻掑叆鍏抽敭瀛梜ey
}
else
{
cout<<"鏍?wèi)涓凡鏈夌浉鍚岀殑鑺傜?"<<endl;
}
}//InserBTree
B鏍?wèi)涓殑鍒犻櫎鎿嶄綔涓庢彃鍏ユ搷浣溇c諱技錛屼絾瑕佺◢寰鏉備簺銆傚鏋滃垹闄ょ殑鍏抽敭鐮佷笉鍦ㄥ彾緇撶偣灞傦紝鍒欏厛鎶婃鍏抽敭鐮佷笌瀹冨湪B鏍?wèi)閲岀殑鍚幘lу鎹綅緗紝鐒跺悗鍐嶅垹闄よ鍏抽敭鐮併傚鏋滃垹闄ょ殑鍏抽敭鐮佸湪鍙剁粨鐐瑰眰錛屽垯鎶婂畠浠庡畠鎵鍦ㄧ殑緇撶偣閲屽幓鎺夛紝榪欏彲鑳藉鑷存緇撶偣鎵鍖呭惈鐨勫叧閿爜鐨勪釜鏁板皬浜?-1銆傝繖縐嶆儏鍐典笅錛岃冨療璇ョ粨鐐圭殑宸︽垨鍙沖厔寮燂紝浠庡厔寮熺粨鐐圭Щ鑻ュ共涓叧閿爜鍒拌緇撶偣涓潵(榪欎篃娑夊強(qiáng)鍒板畠浠殑鐖剁粨鐐逛腑鐨勪竴涓叧閿爜瑕佸仛鐩稿簲鍙樺寲)錛屼嬌涓や釜緇撶偣鎵鍚叧閿爜涓暟鍩烘湰鐩稿悓銆傚彧鏈夊湪鍏勫紵緇撶偣鐨勫叧閿爜涓暟涔熷緢灝戯紝鍒氬ソ絳変簬 -1鏃訛紝榪欎釜縐誨姩涓嶈兘榪涜銆傝繖縐嶆儏鍐典笅錛岃鎶婂皢鍒犻櫎鍏抽敭鐮佺殑緇撶偣錛屽畠鐨勫厔寮熺粨鐐瑰強(qiáng)瀹冧滑鐨勭埗緇撶偣涓殑涓涓叧閿爜鍚堝茍涓轟竴涓粨鐐廣?
B+鏍?/strong>
銆B+鏍?wèi)鏄簲鏂囦欢绯痪l熸墍闇鑰屽嚭鐨勪竴縐?a target="_blank">B-鏍?/font>鐨勫彉鍨嬫爲(wèi)銆備竴媯祄闃剁殑B+鏍?wèi)鍜宮闃剁殑B-鏍?wèi)鐨勫樊寮傚湪浜庡Q?1銆丅+鏍?wèi)鐨勬煡鎵?/span>
2銆丅+鏍?wèi)鐨勬彃鍏?/span>
3銆丅+鏍?wèi)鐨勫垹闄?/span>
B鏍?/strong>1銆佷簩鍙夋帓搴忔爲(wèi)錛圔鏍?wèi)锛夌殑鏌ユ壘锛?xì)
2銆佷簩鍙夋帓搴忔爲(wèi)錛圔鏍?wèi)锛夌殑鎻掑叆鍜屽垹闄ゅQ?/span>
]]>
int SeqSearch(Seqlist R錛孠eyType K)
{
//鍦ㄩ『搴忚〃R[1..n]涓『搴忔煡鎵懼叧閿瓧涓篕鐨勭粨鐐癸紝
//鎴愬姛鏃惰繑鍥炴壘鍒扮殑緇撶偣浣嶇疆錛屽け璐ユ椂榪斿洖-1
int i錛?br /> for(i=0;i<R.len;i++)
{
if(R[i].key==K) return i;
}
return -1錛?nbsp;
} //SeqSearch
②銆佷粠琛ㄤ腑鏈鍚庝竴涓褰曞紑濮嬶紝閫愪釜榪涜涓庡叧閿瓧姣旇緝銆傜洿鑷崇涓涓鹼紝elem[0]=key錛屼負(fù)璁劇疆“鍝ㄥ叺”銆傛壘涓嶅埌榪斿洖0
int SeqSearch(Seqlist R錛孠eyType K)
{
//鍦ㄩ『搴忚〃R[1..n]涓『搴忔煡鎵懼叧閿瓧涓篕鐨勭粨鐐癸紝
//鎴愬姛鏃惰繑鍥炴壘鍒扮殑緇撶偣浣嶇疆錛屽け璐ユ椂榪斿洖0
int i錛?br /> R[0].key=K錛?//璁劇疆鍝ㄥ叺
for(i=R.len錛汻[i].key!=K;i--)錛?//浠庤〃鍚庡線鍓嶆壘
return i錛?//鑻涓?錛岃〃紺烘煡鎵懼け璐ワ紝鍚﹀垯R[i]鏄鎵劇殑緇撶偣
} //SeqSearch
姣旇緝錛?font face="瀹嬩綋">鎴愬姛鏃剁殑欏哄簭鏌ユ壘鐨勫鉤鍧囨煡鎵鵑暱搴︼細(xì)
銆鍦ㄧ瓑姒傜巼鎯呭喌涓嬶紝pi=1/n(1≤i≤n)錛屾晠鎴愬姛鐨勫鉤鍧囨煡鎵鵑暱搴︿負(fù)
(n+…+2+1)/n=(n+1)/2
鍗蟲煡鎵炬垚鍔熸椂鐨勫鉤鍧囨瘮杈冩鏁扮害涓鴻〃闀跨殑涓鍗娿?br />鑻鍊間笉鍦ㄨ〃涓紝鍒欓』榪涜n+1嬈℃瘮杈冧箣鍚庢墠鑳界‘瀹氭煡鎵懼け璐ャ?br />
2銆佹姌鍗婃煡鎵撅細(xì)錛堜簩鍒嗘硶鏌ユ壘錛?蹇呴』鏈夊簭)
①銆佸亣璁炬暟鎹槸鎸夊崌搴忔帓搴忕殑錛屽浜庣粰瀹氬紉錛屼粠搴忓垪鐨勪腑闂翠綅緗紑濮嬫瘮杈冿紝濡傛灉褰撳墠浣嶇疆鍊肩瓑浜巟錛屽垯鏌ユ壘鎴愬姛錛?br />②銆佽嫢x灝忎簬褰撳墠浣嶇疆鍊鹼紝鍒欏湪鏁板垪鐨勫墠鍗婃涓煡鎵撅紱鑻澶т簬褰撳墠浣嶇疆鍊煎垯鍦ㄦ暟鍒楃殑鍚庡崐孌典腑緇х畫鏌ユ壘錛岀洿鍒版壘鍒頒負(fù)姝€?/span>
int search(int *a,int key,int low,int high)
{
int mid;
銆 mid = (low + high)/2;
while(low<high)
{
if(a[mid] == key) return mid;
else
if (a[mid]>key) high=mid;
else low=mid;
mid = (low + high)/2;
}//while
return -1; //娌℃湁鎵懼埌
}//search
鐢ㄩ掑綊鎬濇兂錛?/span>
銆int search(int *a,int key,int low,int high)
銆銆{
銆 銆int mid;
銆銆 if(low > high)
銆 銆return -1;
銆 銆mid = (low + high)/2;
銆 銆if(a[mid] == key) return mid;
銆 銆else if(a[mid] > key) return search(a,key,low,mid -1);
銆 銆else return search(a,key,mid + 1,high);
銆銆}
3銆?br />/////////////////////寰呯畫...
]]>
(2)銆佽嫢瀹冪殑鍙沖瓙鏍?wèi)涓嵔I猴紝鍒欏彸瀛愭爲(wèi)涓婃墍鏈夌粨鐐圭殑閿煎潎澶т簬瀹冪殑鏍圭粨鐐圭殑閿鹼紱
(3)銆佸畠鐨勫乏銆佸彸瀛愭爲(wèi)涔熷垎鍒負(fù)浜屽弶鎺掑簭鏍?wèi)銆?br />娉ㄦ剰錛氾細(xì)錛氫簩鍙夋帓搴忔爲(wèi)鏄竴縐?span style="color: red">鍔ㄦ佹爲(wèi)琛?/span>錛屾爲(wèi)鐨勭粨鏋勯氬父涓嶆槸涓嬈$敓鎴愮殑銆傝屾槸鍦ㄦ煡鎵劇殑榪囩▼涓紝褰撴爲(wèi)涓笉瀛樺湪鍏抽敭瀛楃瓑浜庣粰瀹氬肩殑鑺傜偣鏃跺啀榪涜鎻掑叆銆傛柊鎻掑叆鐨勭粨鐐逛竴瀹氭槸涓涓柊娣誨姞鐨?font color="#136ec2">鍙跺瓙緇撶偣錛屽茍涓旀槸鏌ユ壘涓嶆垚鍔熸椂鏌ユ壘璺緞涓婅闂殑鏈鍚庝竴涓粨鐐圭殑宸﹀瀛愭垨鍙沖瀛愮粨鐐廣?br />
2銆佹彃鍏ヤ笌鏌ユ壘綆楁硶錛?br />鏌ユ壘錛?br />錛?錛夈佽嫢浜屽弶鎺掑簭鏍?wèi)闈灲I猴紝灝嗙粰瀹氬間笌鏍硅妭鐐圭殑鍏抽敭瀛楀兼瘮杈冿紝鑻ョ浉絳夛紝鍒欐煡鎵炬垚鍔燂紱
錛?錛夈佽嫢涓嶇瓑錛屽垯褰撴牴鑺傜偣鐨勫叧閿瓧鍊煎ぇ浜庣粰瀹氬兼椂錛屽埌鏍圭殑宸﹀瓙鏍?wèi)涓瓨q涜鏌ユ壘錛?br />錛?錛夈佸惁鍒欏埌鏍圭殑鍙沖瓙鏍?wèi)涓瓨q涜鏌ユ壘銆傝嫢鎵懼埌錛屽垯鏌ユ壘榪囩▼鏄蛋浜嗕竴鏉′粠鏍?wèi)鏍瑰埌鎵鎵懼埌鑺傜偣鐨勮礬寰勶紱
錛?錛夈佸惁鍒欙紝鏌ユ壘榪囩▼緇堟浜庝竴媯電┖鏍?wèi)銆?br />//① 銆佹櫘閫氭煡鎵撅紝鏌ユ壘涓嶆垚鍔熻繑鍥濶ULL
閫掑綊鎬濇兂錛?/span>
BiTree SearchBST (BiTree *T錛孠eyType key)
{
//鍦ㄦ牴鎸囬拡T鎵鎸囦簩鍙夋帓搴忔爲(wèi)涓掑綊鍦版煡鎵炬煇鍏抽敭瀛楃瓑浜巏ey鐨勬暟鎹厓绱?br /> //鑻ユ煡鎵炬垚鍔燂紝鍒欒繑鍥炴寚鍚戣鏁版嵁鍏冪礌緇撶偣鐨勬寚閽堬紝鍚﹀垯榪斿洖絀烘寚閽?br /> if( (!T)||(key==T—>data.key))
return (T)錛?//鏌ユ壘緇撴潫,姝ゆ椂T涓篘ULL錛屾垨鑰呬負(fù)璇ョ粨鐐?br /> else if (key< T—>data.key)
return(SearchBST(T—>lchild錛宬ey))錛?//鍦ㄥ乏瀛愭爲(wèi)涓戶緇煡鎵?br /> else
return(SearchBST(T —>rchild錛宬ey))錛?/ 鍦ㄥ彸瀛愭爲(wèi)涓戶緇煡鎵?br /> }//SearchBST
闈為掑綊鎬濇兂錛?br />BiTree SearchBST (BiTree *root錛孠eyType key)
{
BiTree *p錛?br /> if( root 錛濓紳 NULL)return NULL錛?font size="2">//鏌ユ壘緇撴潫,姝ゆ椂鏍逛負(fù)NULL錛?/font>
p 錛?root錛?br /> while(p!=NULL)
{
if(p 錛?gt;key==Key)breat錛?/font>
if( Key < p ->key) p 錛漰 錛?gt;lchild錛?font size="2">//鍦ㄥ乏瀛愭爲(wèi)涓戶緇煡鎵?/font>
else p 錛?p 錛?gt;rchild錛?/鍦ㄥ彸瀛愭爲(wèi)涓戶緇煡鎵?/font>
}
return p錛?br />}
//② 銆佹煡鎵句笉鎴愬姛錛岃繑鍥炴彃鍏ヤ綅緗?br /> //鍦ㄦ牴鎸囬拡T鎵鎸囦簩鍙夋帓搴忔爲(wèi)涓掑綊鍦版煡鎵懼叾鍏抽敭瀛楃瓑浜巏ey鐨勬暟鎹厓绱狅紝
//鑻ユ煡鎵炬垚鍔燂紝鍒欐寚閽坧鎸囧悜璇ユ暟鎹厓绱犵粨鐐癸紝騫惰繑鍥濼RUE錛?br /> //鍚﹀垯鎸囬拡p鎸囧悜鏌ユ壘璺緞涓婅闂殑鏈鍚庝竴涓粨鐐瑰茍榪斿洖FALSE錛?br /> //鎸囬拡f鎸囧悜T鐨勫弻浜詫紝鍏跺垵濮嬭皟鐢ㄥ間負(fù)NULL
BOOL SearchBST(BiTree *T錛孠eyType key錛孊iTree *f錛孊iTree &p)
{
if(!T) {p=f錛況eturn FALSE錛泒 //鏌ユ壘涓嶆垚鍔?br /> else if (key==T—>data.key)
{p=T錛況eturn TRUE錛泒 //鏌ユ壘鎴愬姛
else if (key<T—>data.key) SearchBST(T—>lchild錛宬ey錛孴錛宲)錛?//鍦ㄥ乏瀛愭爲(wèi)涓戶緇煡鎵?br /> else SearchBST(T—>rchild錛宬ey錛孴錛宲)錛?/鍦ㄥ彸瀛愭爲(wèi)涓戶緇煡鎵?br /> }//SearchBST
鎻掑叆錛?br />錛?錛夈侀鍏堟墽琛屾煡鎵劇畻娉曪紝鎵懼嚭琚彃緇撶偣鐨勭埗浜茬粨鐐廣傛病鎵懼埌鍒欐柊寤哄瓙緇撶偣
錛?錛夈佸垽鏂鎻掔粨鐐規(guī)槸鍏剁埗浜茬粨鐐圭殑宸︺佸彸鍎垮瓙銆傚皢琚彃緇撶偣浣滀負(fù)鍙跺瓙緇撶偣鎻掑叆銆?
錛?錛夈佽嫢浜屽弶鏍?wèi)湄?fù)絀恒傚垯棣栧厛鍗曠嫭鐢熸垚鏍圭粨鐐?br />
鍩轟簬BOOL SearchBST(BiTree *T錛孠eyType key錛孊iTree *f錛孊iTree &p)鐨勬彃鍏ョ畻娉?br />鐩稿綋浜庢柊寤哄瓙鏍?wèi)銆?br /> //褰撲簩鍙夋帓搴忔爲(wèi)T涓笉瀛樺湪鍏抽敭瀛楃瓑浜巈.key鐨勬暟鎹厓绱犳椂,鎻掑叆e騫惰繑鍥濼RUE錛屽惁鍒欒繑鍥濬ALSE
Status Insert BST(BiTree &T錛孍lemType e)
{
if(!SearchBST(T錛宔.key錛孨ULL錛宲) ) //榪斿洖P涓烘彃鍏ョ殑緇撶偣鐐?br /> { //鍏堟煡鎵撅紝涓嶆垚鍔熸柊寤虹粨鐐?br /> s=(BiTree)malloc(sizeof(BiTNode))錛?br /> s->data=e錛?s->lchild= s->rchild=NULL錛?
if (!p) T = s錛?//琚彃緇撶偣*s涓烘柊鐨勬牴緇撶偣 錛屽師鏍?wèi)湄?fù)絀?br /> else if (e.key<p->data.key) p->lchild=s錛?//琚彃緇撶偣*s涓哄乏瀛╁瓙
else p—>rchild=s //琚彃緇撶偣*s涓哄彸瀛╁瓙
return TRUE錛?br /> }
else
return FALSE; //鏍?wèi)涓凡鏈夊叧閿瓧鐩稿悓鐨劸l撶偣錛屼笉鍐嶆彃鍏?br /> }// Insert BST
void InsertBST(BSTree *Tptr錛孠eyType key)
{
//鑻ヤ簩鍙夋帓搴忔爲(wèi) *Tptr涓病鏈夊叧閿瓧涓簁ey錛屽垯鎻掑叆錛屽惁鍒欑洿鎺ヨ繑鍥?br /> BSTNode *f錛?p=*TPtr錛?//p鐨勫垵鍊兼寚鍚戞牴緇撶偣
while(p){ //鏌ユ壘鎻掑叆浣嶇疆
if(p->key==key) return錛?/鏍?wèi)涓凡鏈塳ey錛屾棤欏繪彃鍏?br /> f=p錛?//f淇濆瓨褰撳墠鏌ユ壘鐨勭粨鐐?/span>
p=(key<p->key)?p->lchild錛歱->rchild錛?br /> //鑻ey<p->key錛屽垯鍦ㄥ乏瀛愭爲(wèi)涓煡鎵撅紝鍚﹀垯鍦ㄥ彸瀛愭爲(wèi)涓煡鎵?br /> } //endwhile
//f涓烘彃鍏ョ殑緇撶偣
p=(BSTNode *)malloc(sizeof(BSTNode))錛?br /> p->key=key錛?p->lchild=p->rchild=NULL錛?//鐢熸垚鏂扮粨鐐?br /> if(*TPtr==NULL) //鍘熸爲(wèi)涓虹┖
*Tptr=p錛?//鏂版彃鍏ョ殑緇撶偣涓烘柊鐨勬牴
else //鍘熸爲(wèi)闈炵┖鏃跺皢鏂扮粨鐐瑰叧p浣滀負(fù)鍏砯鐨勫乏瀛╁瓙鎴栧彸瀛╁瓙鎻掑叆
if(key<f->key)
f->lchild=p錛?br /> else f->rchild=p錛?br /> } //InsertBST
4銆佸垹闄ょ畻娉?br />①鍒犻櫎鎿嶄綔鐨勪竴鑸楠?br />(1) 榪涜鏌ユ壘
銆鏌ユ壘鏃訛紝浠鎸囧悜褰撳墠璁塊棶鍒扮殑緇撶偣錛宲arent鎸囧悜鍏跺弻浜?鍏跺垵鍊間負(fù)NULL)銆傝嫢鏍?wèi)涓壘涓嶅埌琚垹缁撶偣鍒櫂q斿洖錛屽惁鍒欒鍒犵粨鐐規(guī)槸*p銆?br />(2) 鍒犲幓*p銆?br /> 銆鍒?p鏃訛紝搴斿皢*p鐨勫瓙鏍?鑻ユ湁)浠嶈繛鎺ュ湪鏍?wèi)涓婁笖淇濇寔BST鎬ц川涓嶅彉銆傛寜*p鐨勫瀛愭暟鐩垎涓夌鎯呭喌榪涜澶勭悊銆?br />
②鍒犻櫎*p緇撶偣鐨勪笁縐嶆儏鍐?/strong>
(1)*p鏄彾瀛?鍗沖畠鐨勫瀛愭暟涓?)
銆鏃犻』榪炴帴*p鐨勫瓙鏍?wèi)锛屽彧闇灝?p鐨勫弻浜?parent涓寚鍚?p鐨勬寚閽堝煙緗┖鍗沖彲銆?br />
(2)*p鍙湁涓涓瀛?child
銆鍙渶灝?child鍜?p鐨勫弻浜茬洿鎺ヨ繛鎺ュ悗錛屽嵆鍙垹鍘?p銆?br /> 娉ㄦ剰錛?/font>
銆*p鏃㈠彲鑳芥槸*parent鐨勫乏瀛╁瓙涔熷彲鑳芥槸鍏跺彸瀛╁瓙錛岃?child鍙兘鏄?p鐨勫乏瀛╁瓙鎴栧彸瀛╁瓙錛屾晠鍏辨湁4縐嶇姸鎬併?br />(3)*p鏈変袱涓瀛?br /> 銆鍏堜護(hù)q=p錛屽皢琚垹緇撶偣鐨勫湴鍧淇濆瓨鍦╭涓紱鐒跺悗鎵?q鐨勪腑搴忓悗緇?p錛屽茍鍦ㄦ煡鎵捐繃紼嬩腑浠嶇敤parent璁頒綇*p鐨勫弻浜蹭綅緗?q鐨勪腑搴忓悗緇?p涓瀹氭槸*q鐨勫彸瀛愭爲(wèi)涓渶宸︿笅鐨勭粨鐐癸紝瀹冩棤宸﹀瓙鏍?wèi)銆傚洜姝わ紝鍙互灝嗗垹鍘?q鐨勬搷浣滆漿鎹負(fù)鍒犲幓鐨?p鐨勬搷浣滐紝鍗沖湪閲婃斁緇撶偣*p涔嬪墠灝嗗叾鏁版嵁澶嶅埗鍒?q涓紝灝辯浉褰撲簬鍒犲幓浜?q銆?br />③浜屽弶鎺掑簭鏍?wèi)鍒犻櫎绠楁?/strong>
鍒嗘瀽錛?br /> 銆涓婅堪涓夌鎯呭喌閮借兘緇熶竴鍒版儏鍐?2)錛岀畻娉曚腑鍙渶閽堝鎯呭喌(2)澶勭悊鍗沖彲銆?br /> 銆娉ㄦ剰杈圭晫鏉′歡錛氳嫢parent涓虹┖錛岃鍒犵粨鐐?p鏄牴錛屾晠鍒犲幓*p鍚庯紝搴斿皢child緗負(fù)鏍廣?br />
綆楁硶錛氬垹闄ゅ叧閿瓧涓簁ey鐨勭粨鐐?
void DelBSTNode(BSTree *Tptr錛孠eyType key)
{
//鍦ㄤ簩鍙夋帓搴忔爲(wèi)*Tptr涓垹鍘誨叧閿瓧涓簁ey鐨勭粨鐐?br /> BSTNode *parent=NUll錛?p=*Tptr錛?q錛?child錛?br /> while(p)
{
//浠庢牴寮濮嬫煡鎵懼叧閿瓧涓簁ey鐨勫緟鍒犵粨鐐?br /> if(p->key==key) break錛?/宸叉壘鍒幫紝璺沖嚭鏌ユ壘寰幆
parent=p錛?//parent鎸囧悜*p鐨勫弻浜?br /> p=(key<p->key)?p->lchild錛歱->rchild錛?//鍦ㄥ叧p鐨勫乏鎴栧彸瀛愭爲(wèi)涓戶緇壘
}
//娉ㄦ剰錛氫篃鍙互浣跨敤鍩轟簬BOOL SearchBST(BiTree *T錛孠eyType key錛孊iTree *f錛孊iTree &p)鐨勬煡鎵劇畻娉?/strong>
//緇撴灉鏄?nbsp; parent 璁板綍浜嗚鍒犻櫎緇撶偣鐨勭埗緇撶偣錛宲鎸囧悜瑕佸垹闄ょ殑緇撶偣
if(!p) return錛?//鎵句笉鍒拌鍒犵粨鐐瑰垯榪斿洖
q=p錛?//q璁頒綇琚垹緇撶偣*p
if(q->lchild && q->rchild) //*q鐨勪袱涓瀛愬潎闈炵┖錛屾晠鎵?q鐨勪腑搴忓悗緇?p
for(parent=q錛宲=q->rchild錛?p->lchild錛?parent=p錛宲=p=->lchild)錛?br /> //鐜板湪鎯呭喌(3)宸茶杞崲涓烘儏鍐?2)錛岃屾儏鍐?1)鐩稿綋浜庢槸鎯呭喌(2)涓璫hild=NULL鐨勭姸鍐?br /> child=(p->lchild)?p->lchild錛歱->rchild錛?/鑻ユ槸鎯呭喌(2)錛屽垯child闈炵┖錛涘惁鍒檆hild涓虹┖
if(!parent) //*p鐨勫弻浜蹭負(fù)絀猴紝璇存槑*p涓烘牴錛屽垹*p鍚庡簲淇敼鏍規(guī)寚閽?br /> *Tptr=child錛?//鑻ユ槸鎯呭喌(1)錛屽垯鍒犲幓*p鍚庯紝鏍?wèi)湄?fù)絀猴紱鍚﹀垯child鍙樹負(fù)鏍?br /> else{ //*p涓嶆槸鏍癸紝灝?p鐨勫瀛愬拰*p鐨勫弻浜茶繘琛岃繛鎺ワ紝*p浠庢爲(wèi)涓婅鎽樹笅
if(p==parent->lchild) //*p鏄弻浜茬殑宸﹀瀛?br /> parent->lchild=child錛?//*child浣滀負(fù)*parent鐨勫乏瀛╁瓙
else parent->rchild=child錛?//*child浣滀負(fù) parent鐨勫彸瀛╁瓙
if(p!=q) //鏄儏鍐?3)錛岄渶灝?p鐨勬暟鎹鍒跺埌*q
q->key=p->key錛?//鑻ヨ繕鏈夊叾瀹冩暟鎹煙浜﹂渶澶嶅埗
} //endif
free(p)錛?/閲婃斁*p鍗犵敤鐨勭┖闂?br /> } //DelBSTNode
緇欏嚭涓夌鎯呭喌鐨勪笉鍚岀畻娉?br />絎竴縐嶏細(xì)
btree * DelNode(btree *p)
{
if (p->lchild)
{
btree *r = p->lchild; //r鎸囧悜鍏跺乏瀛愭爲(wèi);
while(r->rchild != NULL)//鎼滅儲宸﹀瓙鏍?wèi)鐨勬渶鍙寵竟鐨勫彾瀛愮粨鐐?/span>r
{
r = r->rchild;
}
r->rchild = p->rchild;
btree *q = p->lchild; //q鎸囧悜鍏跺乏瀛愭爲(wèi);
free(p);
return q;
}
else
{
btree *q = p->rchild; //q鎸囧悜鍏跺彸瀛愭爲(wèi);
free(p);
return q;
}
}
絎簩縐嶏細(xì)
btree * DelNode(btree *p)
{
if (p->lchild)
{
btree *r = p->lchild; //r鎸囧悜鍏跺乏瀛愭爲(wèi);
btree *prer = p->lchild; //prer鎸囧悜鍏跺乏瀛愭爲(wèi);
while(r->rchild != NULL)//鎼滅儲宸﹀瓙鏍?wèi)鐨勬渶鍙寵竟鐨勫彾瀛愮粨鐐?/span>r
{
prer = r;
r = r->rchild;
}
if(prer != r)//鑻?/span>r涓嶆槸p鐨勫乏瀛╁瓙錛屾妸r鐨勫乏瀛╁瓙浣滀負(fù)r鐨勭埗浜茬殑鍙沖瀛?/span>
{
prer->rchild = r->lchild;
r->lchild = p->lchild; //琚垹緇撶偣p鐨勫乏瀛愭爲(wèi)浣滀負(fù)r鐨勫乏瀛愭爲(wèi)
}
r->rchild = p->rchild; //琚垹緇撶偣p鐨勫彸瀛愭爲(wèi)浣滀負(fù)r鐨勫彸瀛愭爲(wèi)
free(p);
return r;
}
else
{
btree *q = p->rchild; //q鎸囧悜鍏跺彸瀛愭爲(wèi);
free(p);
return q;
}
}
]]>
鏉冨?/span>錛氬搱澶浖鏍?wèi)鐨勬潈鍊兼槸鑷繁瀹氫箟鐨勶紝浠栫殑鐗╃悊鎰忎箟琛ㄧず鏁版嵁鍑虹幇鐨勬鏁般侀鐜囥傚彲浠ョ敤鏍?wèi)鐨勬瘡涓l撶偣鏁版嵁鍩焏ata瀛樻斁涓涓壒瀹氱殑鏁拌〃紺哄畠鐨勫箋?span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">
璺緞闀垮害錛氬湪涓媯墊爲(wèi)涓紝浠庝竴涓粨鐐瑰線涓嬪彲浠ヨ揪鍒扮殑瀛╁瓙鎴栧瓙瀛欑粨鐐逛箣闂寸殑閫氳礬錛岀О涓鴻礬寰勩?span style="color: red">閫氳礬涓垎鏀殑鏁扮洰縐頒負(fù)璺緞闀垮害銆傝嫢瑙勫畾鏍圭粨鐐圭殑灞傛暟涓?錛屽垯浠庢牴緇撶偣鍒扮L灞傜粨鐐圭殑璺緞闀垮害涓篖-1銆?br />
緇撶偣鐨勫甫鏉冭礬寰勯暱搴?/span>涓猴細(xì)浠庢牴緇撶偣鍒拌緇撶偣涔嬮棿鐨勮礬寰勯暱搴︿笌璇ョ粨鐐圭殑鏉冪殑涔樼Н銆?nbsp; 鏍?wèi)涓墍鏈夊彾瀛愯妭鐐圭殑甯︽潈璺緞闀垮害涔嬪拰錛?span style="color: red">WPL=sigma(w*l)
2銆佸搱澶浖鏍?wèi)鐨勬瀯閫犺繃紼嬨傦紙緇撳悎鍥句緥錛?br />鍋囪鏈塶涓潈鍊鹼紝鍒欐瀯閫犲嚭鐨勫搱澶浖鏍?wèi)鏈塶涓彾瀛愮粨鐐廣?n涓潈鍊煎垎鍒涓?w1銆亀2銆?#8230;銆亀n錛屽垯鍝堝か鏇兼爲(wèi)鐨勬瀯閫犺鍒欎負(fù)錛?
銆銆(1) 灝唚1銆亀2銆?#8230;錛寃n鐪嬫垚鏄湁n 媯墊爲(wèi)鐨勬.鏋?姣忔5鏍?wèi)浠呮湁涓涓粨鐐?錛?
銆銆(2) 鍦ㄦ.鏋椾腑閫夊嚭涓や釜鏍圭粨鐐圭殑鏉冨兼渶灝忕殑鏍?wèi)鍚堯q訛紝浣滀負(fù)涓媯墊柊鏍?wèi)鐨勫乏銆佸彸瀛愭爲(wèi)錛屼笖鏂版爲(wèi)鐨勬牴緇撶偣鏉冨間負(fù)鍏跺乏銆佸彸瀛愭爲(wèi)鏍圭粨鐐規(guī)潈鍊間箣鍜岋紱
銆銆(3)浠庢.鏋椾腑鍒犻櫎閫夊彇鐨勪袱媯墊爲(wèi)錛屽茍灝嗘柊鏍?wèi)鍔犲叆妫灄锛?
銆銆(4)閲嶅(2)銆?3)姝ワ紝鐩村埌媯灄涓彧鍓╀竴媯墊爲(wèi)涓烘錛岃鏍?wèi)鍗充负鎵姹傚緱鐨勫搱澶浖鏍?br />
3銆佸搱澶浖鏍?wèi)鐨勫簲鐢ㄥQ氬搱澶浖緙栫爜錛堝墠緙緙栫爜錛?br />鍝堝か鏇肩紪鐮?/strong>
鍦ㄦ暟鎹氫俊涓紝閫氬父闇瑕佹妸瑕佷紶閫佺殑鏂囧瓧杞崲涓虹敱浜岃繘鍒跺瓧絎?鍜?緇勬垚鐨勪簩榪涘埗涓詫紝榪欎釜榪囩▼琚О涔嬩負(fù)緙栫爜(Encoding)銆備緥濡傦紝鍋囪瑕佷紶閫佺殑鐢墊枃涓篋CBBADD錛岀數(shù)鏂囦腑鍙湁A銆丅銆丆銆丏鍥涚瀛楃錛岃嫢榪欏洓涓瓧絎﹂噰鐢ㄨ〃(a)鎵紺虹殑緙栫爜鏂規(guī)錛屽垯鐢墊枃鐨勪唬鐮佷負(fù)11100101001111錛屼唬鐮佹婚暱搴︿負(fù)14銆傝嫢閲囩敤琛?b) 鎵紺虹殑緙栫爜鏂規(guī)錛屽垯鐢墊枃鐨勪唬鐮佷負(fù)0110101011100錛屼唬鐮佹婚暱搴︿負(fù)13銆?/p>

瀛楃闆嗙殑涓嶅悓緙栫爜鏂規(guī)
鍝堝か鏇兼爲(wèi)鍙敤浜庢瀯閫犳婚暱搴︽渶鐭殑緙栫爜鏂規(guī)銆傚叿浣撴瀯閫犳柟娉曞涓嬶細(xì)
璁鵑渶瑕佺紪鐮佺殑瀛楃闆嗕負(fù){d1,d2,…,dn}錛屽悇涓瓧絎﹀湪鐢墊枃涓嚭鐜扮殑嬈℃暟鎴栭鐜囬泦鍚堜負(fù){w1,w2,…,wn}銆備互d1,d2,…,dn浣滀負(fù)鍙跺瓙緇撶偣錛屼互w1,w2,…,wn浣滀負(fù)鐩稿簲鍙跺瓙緇撶偣鐨勬潈鍊兼潵鏋勯犱竴媯靛搱澶浖鏍?wèi)銆傝瀹氬搱澶浖鏍?wèi)涓殑宸﹀垎鏀唬琛?錛屽彸鍒嗘敮浠h〃1錛屽垯浠庢牴緇撶偣鍒板彾瀛愮粨鐐規(guī)墍緇忚繃鐨勮礬寰勫垎鏀粍鎴愮殑0鍜?鐨勫簭鍒椾究涓鴻緇撶偣瀵瑰簲瀛楃鐨勭紪鐮佸氨鏄搱澶浖緙栫爜(Huffman Encoding)銆?/p>
鍦ㄥ緩绔嬩笉絳夐暱緙栫爜涓紝蹇呴』浣夸換浣曚竴涓瓧絎︾殑緙栫爜閮戒笉鏄彟涓涓紪鐮佺殑鍓嶇紑錛岃繖鏍鋒墠鑳戒繚璇佽瘧鐮佺殑鍞竴鎬с備緥濡傦紝鑻ュ瓧絎鐨勭紪鐮佹槸00錛屽瓧絎鐨勭紪鐮佹槸001錛岄偅涔堝瓧絎鐨勭紪鐮佸氨鎴愪簡瀛楃B鐨勭紪鐮佺殑鍚庣紑銆傝繖鏍鳳紝瀵逛簬浠g爜涓?01001錛屽湪璇戠爜鏃跺氨鏃犳硶鍒ゅ畾鏄皢鍓嶄袱浣嶇爜00璇戞垚瀛楃A榪樻槸灝嗗墠涓変綅鐮?01璇戞垚B銆傝繖鏍風(fēng)殑緙栫爜琚О涔嬩負(fù)鍏鋒湁浜屼箟鎬х殑緙栫爜錛屼簩涔夋х紪鐮佹槸涓嶅敮涓鐨勩傝屽湪鍝堝か鏇兼爲(wèi)涓紝姣忎釜瀛楃緇撶偣閮芥槸鍙跺瓙緇撶偣錛屽畠浠笉鍙兘鍦ㄦ牴緇撶偣鍒板叾瀹冨瓧絎︾粨鐐圭殑璺緞涓婏紝鎵浠ヤ竴涓瓧絎︾殑鍝堝か鏇肩紪鐮佷笉鍙兘鏄彟涓涓瓧絎︾殑鍝堝か鏇肩紪鐮佺殑鍓嶇紑錛屼粠鑰屼繚璇佷簡璇戠爜鐨勯潪浜屼箟鎬с?/p>
涓嬪浘灝辨槸鐢墊枃DCBBADD鐨勫搱澶浖鏍?wèi)锛?xì)

4銆佸搱澶浖鏍?wèi)鐨勫疄鐜?/strong>
鐢卞搱澶浖鏍?wèi)鐨勬瀯閫犵畻娉曞彲鐭ワ紝鐢ㄤ竴涓暟緇勫瓨鏀懼師鏉ョ殑n涓彾瀛愮粨鐐瑰拰鏋勯犺繃紼嬩腑涓存椂鐢熸垚鐨勭粨鐐癸紝鏁扮粍鐨勫ぇ灝忎負(fù)2n-1銆傛墍浠ワ紝鍝堝か鏇兼爲(wèi)綾籋uffmanTree涓湁涓や釜鎴愬憳瀛楁錛歞ata鏁扮粍鐢ㄤ簬瀛樻斁緇撶偣錛宭eafNum琛ㄧず鍝堝か鏇兼爲(wèi)鍙跺瓙緇撶偣鐨勬暟鐩傜粨鐐規(guī)湁鍥涗釜鍩燂紝涓涓煙weight錛岀敤浜庡瓨鏀捐緇撶偣鐨勬潈鍊鹼紱涓涓煙lChild錛岀敤浜庡瓨鏀捐緇撶偣鐨勫乏瀛╁瓙緇撶偣鍦ㄦ暟緇勪腑鐨勫簭鍙鳳紱涓涓煙rChild錛岀敤浜庡瓨鏀捐緇撶偣鐨勫彸瀛╁瓙緇撶偣鍦ㄦ暟緇勪腑鐨勫簭鍙鳳紱涓涓煙parent錛岀敤浜庡垽瀹氳緇撶偣鏄惁宸插姞鍏ュ搱澶浖鏍?wèi)涓?/p>
鍝堝か鏇兼爲(wèi)緇撶偣鐨勭粨鏋勪負(fù)錛殀 鏁版嵁 | weight | lChild | rChild | parent |
public class Node
{
char c; //瀛樺偍鐨勬暟鎹紝涓轟竴涓瓧絎?br /> private double weight; //緇撶偣鏉冨?br /> private int lChild; //宸﹀瀛愮粨鐐?br /> private int rChild; //鍙沖瀛愮粨鐐?br /> private int parent; //鐖剁粨鐐?br /> //緇撶偣鏉冨煎睘鎬?br /> public double Weight
{
get
{
return weight;
}
set
{
weight = value;
}
}
//宸﹀瀛愮粨鐐瑰睘鎬?br /> public int LChild
{
get
{
return lChild;
}
set
{
lChild = value;
}
}
//鍙沖瀛愮粨鐐瑰睘鎬?br /> public int RChild
{
get
{
return rChild;
}
set
{
rChild = value;
}
}
//鐖剁粨鐐瑰睘鎬?br /> public int Parent
{
get
{
return parent;
}
set
{
parent = value;
}
}
//鏋勯犲櫒
public Node()
{
weight = 0;
lChild = -1;
rChild = -1;
parent = -1;
}
//鏋勯犲櫒
public Node(double weitht)
{
this.weight = weitht;
lChild = -1;
rChild = -1;
parent = -1;
}
//鏋勯犲櫒
public Node(int w, int lc, int rc, int p)
{
weight = w;
lChild = lc;
rChild = rc;
parent = p;
}
}
public class HuffmanTree
{
private Node[] data; //緇撶偣鏁扮粍
private int leafNum; //鍙跺瓙緇撶偣鏁扮洰
//绱㈠紩鍣?br /> public Node this[int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
//鍙跺瓙緇撶偣鏁扮洰灞炴?br /> public int LeafNum
{
get
{
return leafNum;
}
set
{
leafNum = value;
}
}
//鏋勯犲櫒
public HuffmanTree(int n)
{
data = new Node[2 * n - 1];
leafNum = n;
}
//鍒涘緩鍝堝か鏇兼爲(wèi)
public void Create(Node[] datain)
{
double minL, minR;
minL = minR = double.MaxValue;
int lchild, rchild;
lchild = rchild = -1;
int length = data.Length;
//鍒濆鍖栧搱澶浖鏍?br /> for (int i = 0; i < length; i++)
data[i] = new Node();
for (int i = 0; i < datain.Length; i++)
data[i] = datain[i];
//澶勭悊n涓彾瀛愮粨鐐癸紝寤虹珛鍝堝か鏇兼爲(wèi)
for (int i = leafNum; i < length; i++)
{
//鍦ㄥ叏閮ㄧ粨鐐逛腑鎵炬潈鍊兼渶灝忕殑涓や釜緇撶偣
for (int j = 0; j < i; j++)
{
if (data[j].Parent == -1)
{
if (data[j].Weight < minL)
{
minR = minL;
minL = data[j].Weight;
rchild = lchild;
lchild = j;
}
else if (data[j].Weight < minR)
{
minR = data[j].Weight;
rchild = j;
}
}
}
data[lchild].Parent = data[rchild].Parent = i;
data[i].Weight = minL + minR;
data[i].LChild = lchild;
data[i].RChild = rchild;
}
}
}
class Program
{
static void Main(string[] args)
{
HuffmanTree tree = new HuffmanTree(5);
Node[] nodes = new Node[] { new Node(1), new Node(2), new Node(2.5d), new Node(3), new Node(2.6d) };
tree.Create(nodes);
Console.ReadLine();
}
}
/////////////////////////////鑺傞夎嚜緗戠粶涓婄殑璧勬枡銆?/p>
鍏朵腑
絎簩涓弬鏁頒負(fù)瀹瑰櫒綾誨瀷銆?br />絎笁涓弬鏁頒負(fù)姣旇緝鍑芥暟銆?br />