![數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)_第1頁](http://file4.renrendoc.com/view/8c862e8835539fd915757f151b1a5706/8c862e8835539fd915757f151b1a57061.gif)
![數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)_第2頁](http://file4.renrendoc.com/view/8c862e8835539fd915757f151b1a5706/8c862e8835539fd915757f151b1a57062.gif)
![數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)_第3頁](http://file4.renrendoc.com/view/8c862e8835539fd915757f151b1a5706/8c862e8835539fd915757f151b1a57063.gif)
![數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)_第4頁](http://file4.renrendoc.com/view/8c862e8835539fd915757f151b1a5706/8c862e8835539fd915757f151b1a57064.gif)
![數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)_第5頁](http://file4.renrendoc.com/view/8c862e8835539fd915757f151b1a5706/8c862e8835539fd915757f151b1a57065.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2021/4/61第七章搜索結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)電子教案殷人昆王宏數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第1頁。22021/4/6靜態(tài)搜索表二叉搜索樹最優(yōu)二叉搜索樹AVL樹伸展樹紅黑樹第七章搜索結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第2頁。32021/4/6搜索(Search)的概念靜態(tài)搜索表所謂搜索,就是在數(shù)據(jù)集合中尋找滿足某種條件的數(shù)據(jù)對象。搜索的結(jié)果通常有兩種可能:搜索成功,即找到滿足條件的數(shù)據(jù)對象。這時(shí),作為結(jié)果,可報(bào)告該對象在結(jié)構(gòu)中的位置,還可給出該對象中的具體信息。搜索不成功,或搜索失敗。作為結(jié)果,應(yīng)報(bào)告一些信息,如失敗標(biāo)志、位置等。
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第3頁。42021/4/6通常稱用于搜索的數(shù)據(jù)集合為搜索結(jié)構(gòu),它是由同一數(shù)據(jù)類型的對象(或記錄)組成。在每個(gè)對象中有若干屬性,其中有一個(gè)屬性,其值可唯一地標(biāo)識(shí)這個(gè)對象。稱為關(guān)鍵碼。使用基于關(guān)鍵碼的搜索,搜索結(jié)果應(yīng)是唯一的。但在實(shí)際應(yīng)用時(shí),搜索條件是多方面的,可以使用基于屬性的搜索方法,但搜索結(jié)果可能不唯一。實(shí)施搜索時(shí)有兩種不同的環(huán)境。靜態(tài)環(huán)境,搜索結(jié)構(gòu)在插入和刪除等操作的前后不發(fā)生改變。靜態(tài)搜索表
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第4頁。52021/4/6動(dòng)態(tài)環(huán)境,為保持較高的搜索效率,搜索結(jié)構(gòu)在執(zhí)行插入和刪除等操作的前后將自動(dòng)進(jìn)行調(diào)整,結(jié)構(gòu)可能發(fā)生變化。
動(dòng)態(tài)搜索表在靜態(tài)搜索表中,數(shù)據(jù)元素存放于數(shù)組中,利用數(shù)組元素的下標(biāo)作為數(shù)據(jù)元素的存放地址。搜索算法根據(jù)給定值k,在數(shù)組中進(jìn)行搜索。直到找到k在數(shù)組中的存放位置或可確定在數(shù)組中找不到
k為止。
靜態(tài)搜索表數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第5頁。62021/4/6數(shù)據(jù)表與搜索表的類定義
#include<iostream.h>#include<assert.h>constintdefaultSize=100;template<classE,classK>classdataList; //數(shù)據(jù)表類的前視定義template<classE,classK>classdataNode{ //數(shù)據(jù)表中結(jié)點(diǎn)類的定義friendclassdataList<E,K>; //聲明其友元類為dataListpublic:數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第6頁。72021/4/6
dataNode(constKx):key(x){} //構(gòu)造函數(shù)
KgetKey()const{returnkey;} //讀取關(guān)鍵碼
voidsetKey(Kx){key=x;} //修改關(guān)鍵碼private:
Kkey; //關(guān)鍵碼域
E
other; //其他域(視問題而定)};template<classE,classK>classdataList{ //數(shù)據(jù)表類定義public:數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第7頁。82021/4/6
dataList(intsz=defaultSize)
:ArraySize(sz),CuurentSize(0){
Element=newdataNode<E,K>[sz];
assert(Element!=NULL);}
dataList(dataList<E,K>&R);//復(fù)制構(gòu)造函數(shù)
virtual~dataList(){delete[]Element;}
//析構(gòu)函數(shù)
virtualintLength(){returnCurrentSize;}
//求表的長度
virtualKgetKey(inti)const{ //提取第
i(1開始)元素值
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第8頁。92021/4/6assert(i>0||i<=CurrentSize);returnElement[i-1].key;}virtualvoidsetKey(Kx,inti){ //修改第i(1開始)元素值
assert(i>0||i<=CurrentSize);
Element[i-1].key=x;} virtualintSeqSearch(constKx)const; //搜索
virtualboolInsert(E&e1); //插入
virtualboolRemove(K
x,E&e1); //刪除friendostream&operator<<(ostream&out,constdataList<E,K>&OutList);//輸出數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第9頁。102021/4/6friendistream&operator>>(istream&in,
dataList<E,K>&InList);//輸入protected:
dataNode<E,K>*Element; //數(shù)據(jù)表存儲(chǔ)數(shù)組
intArraySize,CurrentSize; //數(shù)組最大長度和當(dāng)前長度};template<classE,classK>booldataList<E,K>::Insert(E&e1){//在dataList的尾部插入新元素,若插入失敗函數(shù)返//回false,否則返回true.數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第10頁。112021/4/6if(CurrentSize==ArraySize)returnfalse;
Element[CurrentSize]=e1; //插入在尾端
CurrentSize++;returntrue;};template<classE,classK>booldataList<E,K>::Remove(Kx,E&e1){//在dataList中刪除關(guān)鍵碼為x的元素,通過e1返回。//用尾元素填補(bǔ)被刪除元素。
if(CurrentSize==0)returnfalse;for(inti==0;i<CurrentSize&&
Element[i]!=x;i++); //在表中順序?qū)ふ覕?shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第11頁。122021/4/6if(i==CurrentSize)returnfalse; //未找到
e1=Element[i].other; //找到,保存被刪元素的值
Element[i]=Element[CurrentSize-1];//填補(bǔ)
CurrentSize--;returntrue;};template<classE,classK>ostream&operator<<(ostream&out,constdataList<E,K>&OutList){
out<<“存儲(chǔ)數(shù)組大小”<<endl;數(shù)據(jù)表類的友元函數(shù)
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第12頁。132021/4/6for(inti=1;i<=OutList.CurrentSize;i++)
out<<OutList.Element[i-1]<<‘’;
out<<endl; //輸出表的所有表項(xiàng)到out
out<<“數(shù)組當(dāng)前長度:”<<
OutList.CurrentSize<<endl;//輸出表的當(dāng)前長度到out returnout;};template<classE,classK>istream&operator>>(istream&in,
dataList<E,K>&InList){ 數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第13頁。142021/4/6cout<<“輸入存儲(chǔ)數(shù)組當(dāng)前長度:”;
in>>InList.CurrentSize; //從in輸入表的當(dāng)前長度
cout<<“輸入數(shù)組元素的值:\n”;for(inti=1;i<=InList.CurrentSize;i++){
//從in輸入表的全部表項(xiàng)
cout<<“元素”<<i<<“:”;
in>>InList.Element[i-1];}returnin;};數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第14頁。152021/4/6順序搜索主要用于在線性表中搜索。設(shè)若表中有CurrentSize個(gè)元素,則順序搜索從表的先端開始,順序用各元素的關(guān)鍵碼與給定值x進(jìn)行比較若找到與其值相等的元素,則搜索成功,給出該元素在表中的位置。若整個(gè)表都已檢測完仍未找到關(guān)鍵碼與x相等的元素,則搜索失敗。給出失敗信息。順序搜索(SequentialSearch)
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第15頁。162021/4/6一般的順序搜索算法在第二章已經(jīng)討論過,本章介紹一種使用“監(jiān)視哨”的順序搜索方法。設(shè)在數(shù)據(jù)表dataList中順序搜索關(guān)鍵碼與給定值x相等的數(shù)據(jù)元素,要求數(shù)據(jù)元素在表中從下標(biāo)0開始存放,下標(biāo)為CurrentSize的元素作為控制搜索過程自動(dòng)結(jié)束的“監(jiān)視哨”使用。若搜索成功,則函數(shù)返回該元素在表中序號(hào)Location(比下標(biāo)大1),若搜索失敗,則函數(shù)返回CurrentSize+1。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第16頁。172021/4/6使用監(jiān)視哨的順序搜索算法
template<classE,classK>intdataList<E,K>::SeqSearch(constKx)const{
Element[CurrentSize].key=x; inti=0; //將x設(shè)置為監(jiān)視哨
while(Element[i].key!=x)i++; //從前向后順序搜索
returni+1;};constintSize=10;main(){數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第17頁。182021/4/6dataList<int>L1(Size); //定義int型搜索表L1intTarget;intLoc;cin>>L1;cout<<L1; //輸入L1
cout<<“Searchforainteger:”;cin>>Target; //輸入要搜索的數(shù)據(jù)
if((Location=L1.Seqsearch(Target))!=
L1.Length()) cout<<“找到待查元素位置在:”<<Loc+1
<<endl; //搜索成功
elsecout<<“沒有找到待查元素\n”;
//搜索不成功};數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第18頁。192021/4/6設(shè)數(shù)據(jù)表中有n
個(gè)元素,搜索第i
個(gè)元素的概率為pi,搜索到第i
個(gè)元素所需比較次數(shù)為ci,則搜索成功的平均搜索長度:在順序搜索并設(shè)置“監(jiān)視哨”情形:
ci=i+1,i=0,1,,n-1,因此順序搜索的平均搜索長度數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第19頁。202021/4/6一般表中各個(gè)元素的搜索概率不同,如果按搜索概率的高低排列表中的元素,從有序順序表的情況可知,能夠得到高的平均搜索長度。在等概率情形,pi=1/n,i=1,2,,n。搜索成功的平均搜索程度為:在搜索不成功情形,ASLunsucc
=n+1。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第20頁。212021/4/6采用遞歸方法搜索值為x的元素,每遞歸一層就向待查元素逼近一個(gè)位置,直到到達(dá)該元素。假設(shè)待查元素在第i(1≤i≤n)個(gè)位置,則算法遞歸深度達(dá)i(1~i)。102030405060i=1搜索
30102030405060i=2102030405060i=3遞歸順序搜索的遞歸算法數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第21頁。222021/4/6順序搜索的遞歸算法template<classE,classK>intdataList<E,K>::SeqSearch(constKx,
intloc)const{//在數(shù)據(jù)表Element[1..n]中搜索其關(guān)鍵碼與給定值//匹配的對象,函數(shù)返回其表中位置。參數(shù)loc是在//表中開始搜索位置
if(loc>CurrentSize)return0;//搜索失敗
elseif(Element[loc-1].key==x)returnloc;
//搜索成功
elsereturnSearch(x,loc+1);//遞歸搜索};數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第22頁。232021/4/6基于有序順序表的順序搜索算法template<classType>intsearchList<Type>::Search(constType&x)const{//順序搜索關(guān)鍵碼為x的數(shù)據(jù)對象
for(inti=0;i<CurrentSize;i++)
if(Element[i].key==x)returni;//成功
elseif(Element[i].key>x)break;return
-1;
//順序搜索失敗,返回失敗信息}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第23頁。242021/4/6有序順序表的順序搜索
(10,20,30,40,50,60)105060======203040<<<<<<>>>>>>數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第24頁。252021/4/6基于有序順序表的折半搜索設(shè)n個(gè)對象存放在一個(gè)有序順序表中,并按其關(guān)鍵碼從小到大排好了序。折半搜索時(shí),先求位于搜索區(qū)間正中的對象的下標(biāo)mid,用其關(guān)鍵碼與給定值x比較:
Element[mid].key==x,搜索成功;
Element[mid].key>x,把搜索區(qū)間縮小到表的前半部分,繼續(xù)折半搜索;
Element[mid].key<x,把搜索區(qū)間縮小到表的后半部分,繼續(xù)折半搜索。如果搜索區(qū)間已縮小到一個(gè)對象,仍未找到想要搜索的對象,則搜索失敗。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第25頁。262021/4/6搜索成功的例子-101346810126012345678搜索lowmidhigh66810125678lowmidhigh665lowmidhigh6數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第26頁。272021/4/6搜索失敗的例子-101346810125012345678搜索lowmidhigh56810125678lowmidhigh655lowmidhigh5數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第27頁。282021/4/6template<classType>classorderedList:publicdataList<Type>{//有序表的類定義,繼承了數(shù)據(jù)表public:
orderedList(intsz=10):
dataList<Type>(sz){}~orderedList(){}
intBinarySearch(constType&x
)const;};
template<classType>intorderedList<Type>:://折半搜索算法數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第28頁。292021/4/6BinarySearch(constType&x,const
intlow,const
inthigh)const{//折半搜索的遞歸算法
intmid=-1;if(low<=high){
mid=(low+high)/2;
if(Element[mid].key<x)mid=BinarySearch(x,mid+1,high);
elseif(Element[mid].key>x) mid=BinarySearch(x,low,mid-1);}returnmid;}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第29頁。302021/4/6template<classType>intorderedList<Type>::BinarySearch(constType&x)const{
//折半搜索的迭代算法
inthigh=CurrentSize-1,low=0,mid;
while(low<=high){
mid=(low+high)/2;
if(Element[mid].key<x)low=mid+1; //右縮搜索區(qū)
else
if(Element[mid].key>x)high=mid-1;//左縮搜索區(qū)間
elsereturnmid;//搜索成功
}
return
-1;//搜索失敗}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第30頁。312021/4/6有序順序表的折半搜索的判定樹
(10,20,30,40,50,60)1050======30<<<<<<>>>>>>204060ASLunsucc=(2*1+3*6)/7=20/7ASLsucc=(1+2*2+3*3)/6=14/6數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第31頁。322021/4/6搜索成功時(shí)檢測指針停留在樹中某個(gè)結(jié)點(diǎn)。搜索不成功時(shí)檢測指針停留在某個(gè)外結(jié)點(diǎn)(失敗結(jié)點(diǎn))。3515455025102030搜索22搜索45數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第32頁。332021/4/6折半搜索性能分析若設(shè)n=2h-1,則描述折半搜索的判定樹是高度為h-1
的滿二叉樹。
2h=n+1,h=log2(n+1)第0層結(jié)點(diǎn)有1個(gè),搜索第0層結(jié)點(diǎn)要比較1次;第1層結(jié)點(diǎn)有2個(gè),搜索第1層結(jié)點(diǎn)要比較2次;…,第i(0≤
i
h)層結(jié)點(diǎn)有2i個(gè),搜索第i層結(jié)點(diǎn)要比較i+1次,…。假定每個(gè)結(jié)點(diǎn)的搜索概率相等,即pi
=1/n,則搜索成功的平均搜索長度為數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第33頁。342021/4/6二叉搜索樹(BinarySearchTree)定義
二叉搜索樹或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:每個(gè)結(jié)點(diǎn)都有一個(gè)作為搜索依據(jù)的關(guān)鍵碼(key),所有結(jié)點(diǎn)的關(guān)鍵碼互不相同。左子樹(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都小于根結(jié)點(diǎn)的關(guān)鍵碼。右子樹(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都大于根結(jié)點(diǎn)的關(guān)鍵碼。左子樹和右子樹也是二叉搜索樹。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第34頁。352021/4/6351545504025102030二叉搜索樹例結(jié)點(diǎn)左子樹上所有關(guān)鍵碼小于結(jié)點(diǎn)關(guān)鍵碼;右子樹上所有關(guān)鍵碼大于結(jié)點(diǎn)關(guān)鍵碼;注意:若從根結(jié)點(diǎn)到某個(gè)葉結(jié)點(diǎn)有一條路徑,路徑左邊的結(jié)點(diǎn)的關(guān)鍵碼不一定小于路徑上的結(jié)點(diǎn)的關(guān)鍵碼。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第35頁。362021/4/6如果對一棵二叉搜索樹進(jìn)行中序遍歷,可以按從小到大的順序,將各結(jié)點(diǎn)關(guān)鍵碼排列起來,所以也稱二叉搜索樹為二叉排序樹。二叉搜索樹的類定義#include<iostream.h>#include<stdlib.h>template<classE,classK>structBSTNode{ //二叉樹結(jié)點(diǎn)類
Edata; //數(shù)據(jù)域
BSTNode<E,K>*left,*right;//左子女和右子女?dāng)?shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第36頁。372021/4/6BSTNode(){left=NULL;right=NULL;
}
//構(gòu)造函數(shù)
BSTNode(constEd,BSTNode<E,K>*L=NULL,
BSTNode<E,K>*R=NULL){data=d;left=L;right=R;}
//構(gòu)造函數(shù)~BSTNode(){} //析構(gòu)函數(shù)
voidsetData(Ed){data=d;} //修改
EgetData(){returndata;} //提取
booloperator<(constE&x)
//重載:判小于
{returndata.key<x.key;}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第37頁。382021/4/6booloperator>(constE&x)
//重載:判大于
{returndata.key>x.key;}booloperator==(constE&x)
//重載:判等于
{returndata.key==x.key;}};template<classE,classK>classBST{ //二叉搜索樹類定義public:BST(){root=NULL;
} //構(gòu)造函數(shù)
BST(Kvalue); //構(gòu)造函數(shù)
~BST(){}; //析構(gòu)函數(shù)
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第38頁。392021/4/6boolSearch(constKx)const //搜索
{returnSearch(x,root)!=NULL;}
BST<E,K>&operator=(constBST<E,K>&R); //重載:賦值
voidmakeEmpty()
//置空
{makeEmpty(root);root=NULL;}voidPrintTree()const{PrintTree(root);}//輸出
EMin(){returnMin(root)->data;} //求最小
EMax(){returnMax(root)->data;} //求最大
boolInsert(constE&e1)
//插入新元素
{returnInsert(e1,root);}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第39頁。402021/4/6boolRemove(constKx){returnRemove(x,root);} //刪除含x的結(jié)點(diǎn)private:
BSTNode<E,K>*root; //根指針
KRefValue; //輸入停止標(biāo)志
BSTNode<E,K>* //遞歸:搜索
Search(constKx,BSTNode<E,K>*ptr);voidmakeEmpty(BSTNode<E,K>*&ptr); //遞歸:置空
voidPrintTree(BSTNode<E,K>*ptr)const; //遞歸:打印
BSTNode<E,K>* //遞歸:復(fù)制
Copy(constBSTNode<E,K>*ptr); 數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第40頁。412021/4/6BSTNode<E,K>*Min(BSTNode<E,K>*ptr);
//遞歸:求最小
BSTNode<E,K>*Max(BSTNode<E,K>*ptr);
//遞歸:求最大
boolInsert(constE&e1,BSTNode<E,K>*&ptr);
//遞歸:插入
boolRemove(constKx,BSTNode<E,K>*&ptr);
//遞歸:刪除};二叉搜索樹的類定義用二叉鏈表作為它的存儲(chǔ)表示,許多操作的實(shí)現(xiàn)與二叉樹類似。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第41頁。422021/4/6二叉搜索樹的搜索算法在二叉搜索樹上進(jìn)行搜索,是一個(gè)從根結(jié)點(diǎn)開始,沿某一個(gè)分支逐層向下進(jìn)行比較判等的過程。它可以是一個(gè)遞歸的過程。假設(shè)想要在二叉搜索樹中搜索關(guān)鍵碼為x
的元素,搜索過程從根結(jié)點(diǎn)開始。如果根指針為NULL,則搜索不成功;否則用給定值
x
與根結(jié)點(diǎn)的關(guān)鍵碼進(jìn)行比較:若給定值等于根結(jié)點(diǎn)關(guān)鍵碼,則搜索成功,返回搜索成功信息并報(bào)告搜索到結(jié)點(diǎn)地址。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第42頁。432021/4/6若給定值小于根結(jié)點(diǎn)的關(guān)鍵碼,則繼續(xù)遞歸搜索根結(jié)點(diǎn)的左子樹;否則。遞歸搜索根結(jié)點(diǎn)的右子樹。搜索45搜索成功搜索28搜索失敗351545504025102030數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第43頁。442021/4/6template<classE,classK>BSTNode<E,K>*BST<E,K>::Search(constKx,BSTNode<E,K>*ptr){//私有遞歸函數(shù):在以ptr為根的二叉搜索樹中搜//索含x的結(jié)點(diǎn)。若找到,則函數(shù)返回該結(jié)點(diǎn)的//地址,否則函數(shù)返回NULL值。
if(ptr==NULL)returnNULL;
elseif(x<ptr->data)returnSearch(x,ptr->left);elseif(x>ptr->data)returnSearch(x,ptr->right);elsereturnptr; //搜索成功};數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第44頁。452021/4/6template<classE,classK>BSTNode<E,K>*BST<E,K>::Search(constKx,BSTNode<E,K>*ptr){//非遞歸函數(shù):作為對比,在當(dāng)前以ptr為根的二//叉搜索樹中搜索含x的結(jié)點(diǎn)。若找到,則函數(shù)返//回該結(jié)點(diǎn)的地址,否則函數(shù)返回NULL值。
if(ptr==NULL)returnNULL;
BSTNode<E,K>*temp=ptr;while(temp!=NULL){
if(x==temp->data)returntemp;
if(x<temp->data)
temp=temp->left;數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第45頁。462021/4/6elsetemp=temp->right;}returnNULL;};搜索過程是從根結(jié)點(diǎn)開始,沿某條路徑自上而下逐層比較判等的過程。搜索成功,搜索指針將停留在樹上某個(gè)結(jié)點(diǎn);搜索不成功,搜索指針將走到樹上某個(gè)結(jié)點(diǎn)的空子樹。設(shè)樹的高度為h,最多比較次數(shù)不超過h。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第46頁。472021/4/6二叉搜索樹的插入算法為了向二叉搜索樹中插入一個(gè)新元素,必須先檢查這個(gè)元素是否在樹中已經(jīng)存在。在插入之前,先使用搜索算法在樹中檢查要插入元素有還是沒有。如果搜索成功,說明樹中已經(jīng)有這個(gè)元素,不再插入;如果搜索不成功,說明樹中原來沒有關(guān)鍵碼等于給定值的結(jié)點(diǎn),把新元素加到搜索操作停止的地方。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第47頁。482021/4/635154550402510203028插入新結(jié)點(diǎn)28二叉搜索樹的插入每次結(jié)點(diǎn)的插入,都要從根結(jié)點(diǎn)出發(fā)搜索插入位置,然后把新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第48頁。492021/4/6二叉搜索樹的插入算法template<classE,classK>boolBST<E,K>::Insert(constE&e1,
BSTNode<E,K>*&ptr){ //私有函數(shù):在以ptr為根的二叉搜索樹中插入值為//e1的結(jié)點(diǎn)。若在樹中已有含e1的結(jié)點(diǎn)則不插入
if(ptr==NULL){ //新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入
ptr=newBstNode<E,K>(e1); //創(chuàng)建新結(jié)點(diǎn)
if(ptr==NULL)
{cerr<<"Outofspace"<<endl;exit(1);} returntrue;數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第49頁。502021/4/6}elseif(e1<ptr->data)Insert(e1,ptr->left); //左子樹插入
elseif(e1>ptr->data)Insert(e1,ptr->right); //右子樹插入
elsereturnfalse; //x已在樹中,不再插入};注意參數(shù)表中引用型指針參數(shù)ptr的使用。利用二叉搜索樹的插入算法,可以很方便地建立二叉搜索樹。
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第50頁。512021/4/6輸入數(shù)據(jù)
{53,78,65,17,87,09,81,15}535378537865537865175378658717537865091787537865811787095378651517870981數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第51頁。522021/4/6template<classE,classK>BST<E,K>::BST(Kvalue){//輸入一個(gè)元素序列,建立一棵二叉搜索樹
Ex;
root=NULL;RefValue=value; //置空樹
cin>>x; //輸入數(shù)據(jù)
while(x.key!=RefValue){ //RefValue是一個(gè)輸入結(jié)束標(biāo)志
Insert(x,root);cin>>x; //插入,再輸入數(shù)據(jù)
}};數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第52頁。532021/4/6二叉搜索樹的刪除算法在二叉搜索樹中刪除一個(gè)結(jié)點(diǎn)時(shí),必須將因刪除結(jié)點(diǎn)而斷開的二叉鏈表重新鏈接起來,同時(shí)確保二叉搜索樹的性質(zhì)不會(huì)失去。為保證在刪除后樹的搜索性能不至于降低,還需要防止重新鏈接后樹的高度增加。刪除葉結(jié)點(diǎn),只需將其雙親結(jié)點(diǎn)指向它的指針清零,再釋放它即可。被刪結(jié)點(diǎn)右子樹為空,可以拿它的左子女結(jié)點(diǎn)頂替它的位置,再釋放它。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第53頁。542021/4/6被刪結(jié)點(diǎn)左子樹為空,可以拿它的右子女結(jié)點(diǎn)頂替它的位置,再釋放它。被刪結(jié)點(diǎn)左、右子樹都不為空,可以在它的右子樹中尋找中序下的第一個(gè)結(jié)點(diǎn)(關(guān)鍵碼最小),用它的值填補(bǔ)到被刪結(jié)點(diǎn)中,再來處理這個(gè)結(jié)點(diǎn)的刪除問題。5378651787092345刪除45右子樹空,用左子女頂替53786517870923數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第54頁。552021/4/68853788817940923刪除78左子樹空,用右子女頂替53948817092353788117940945刪除78在右子樹上找中序下第一個(gè)結(jié)點(diǎn)填補(bǔ)2365538188179409452365數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第55頁。562021/4/6二叉搜索樹的刪除算法template<classE,classK>boolBST<E,K>::Remove(constKx,
BstNode<E,K>*&ptr){//在以ptr為根的二叉搜索樹中刪除含x的結(jié)點(diǎn)
BstNode<E,K>*temp;if(ptr!=NULL){if(x<ptr->data)Remove(x,ptr->left);
//在左子樹中執(zhí)行刪除
elseif(x>ptr->data)Remove(x,ptr->right);
//在右子樹中執(zhí)行刪除數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第56頁。572021/4/6elseif(ptr->left!=NULL&&ptr->right!=NULL)
{//ptr指示關(guān)鍵碼為x的結(jié)點(diǎn),它有兩個(gè)子女
temp=ptr->right;
//到右子樹搜尋中序下第一個(gè)結(jié)點(diǎn)
while(temp->left!=NULL)temp=temp->left;
ptr->data=temp->data;
//用該結(jié)點(diǎn)數(shù)據(jù)代替根結(jié)點(diǎn)數(shù)據(jù)
Remove(ptr->data,ptr->right);} else{ //ptr指示關(guān)鍵碼為x的結(jié)點(diǎn)有一個(gè)子女?dāng)?shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第57頁。582021/4/6
temp=ptr; if(ptr->left==NULL)ptr=ptr->right;elseptr=ptr->left;deletetemp;returntrue;} } returnfalse;};注意在刪除算法參數(shù)表引用型指針參數(shù)的使用。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第58頁。592021/4/6
二叉搜索樹性能分析對于有n個(gè)關(guān)鍵碼的集合,其關(guān)鍵碼有n!種不同排列,可構(gòu)成不同二叉搜索樹有
(棵)
{2,1,3}{1,2,3}{1,3,2}{2,3,1}{3,1,2}{3,2,1}
123111132223323數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第59頁。602021/4/6同樣3個(gè)數(shù)據(jù){1,2,3},輸入順序不同,建立起來的二叉搜索樹的形態(tài)也不同。這直接影響到二叉搜索樹的搜索性能。如果輸入序列選得不好,會(huì)建立起一棵單支樹,使得二叉搜索樹的高度達(dá)到最大。用樹的搜索效率來評價(jià)這些二叉搜索樹。為此,在二叉搜索樹中加入外結(jié)點(diǎn),形成判定樹。外結(jié)點(diǎn)表示失敗結(jié)點(diǎn),內(nèi)結(jié)點(diǎn)表示搜索樹中已有的數(shù)據(jù)。這樣的判定樹即為擴(kuò)充的二叉搜索樹。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第60頁。612021/4/6舉例說明。已知關(guān)鍵碼集合
{a1,a2,a3}=
{do,if,to},對應(yīng)搜索概率p1,p2,p3,在各搜索不成功間隔內(nèi)搜索概率分別為q0,q1,q2,q3。可能的二叉搜索樹如下所示。doiftodoiftoq0q1p1q2p2q3p3q0q1q2q3p1p2p3(a)(b)數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第61頁。622021/4/6判定樹doiftoq0q1p1q2p2q3p3doiftoq0q1p1q2p2q3p3(d)(c)doiftoq0q1p1q2p2q3p3(e)數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第62頁。632021/4/6在判定樹中
○表示內(nèi)部結(jié)點(diǎn),包含了關(guān)鍵碼集合中的某一個(gè)關(guān)鍵碼;□表示外部結(jié)點(diǎn),代表各關(guān)鍵碼間隔中的不在關(guān)鍵碼集合中的關(guān)鍵碼。在每兩個(gè)外部結(jié)點(diǎn)間必存在一個(gè)內(nèi)部結(jié)點(diǎn)。一棵判定樹上的搜索成功的平均搜索長度ASLsucc可以定義為該樹所有內(nèi)部結(jié)點(diǎn)上的搜索概率p[i]與搜索該結(jié)點(diǎn)時(shí)所需的關(guān)鍵碼比較次數(shù)c[i](=l[i],即結(jié)點(diǎn)所在層次)乘積之和:數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第63頁。642021/4/6設(shè)各關(guān)鍵碼的搜索概率相等:p[i]=1/n搜索不成功的平均搜索長度ASLunsucc為樹中所有外部結(jié)點(diǎn)上搜索概率q[j]與到達(dá)外部結(jié)點(diǎn)所需關(guān)鍵碼比較次數(shù)c'[j](=l'[j])乘積之和:設(shè)外部結(jié)點(diǎn)搜索概率相等:q[j]=1/(n+1):數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第64頁。652021/4/6設(shè)樹中所有內(nèi)、外部結(jié)點(diǎn)的搜索概率都相等:
p[i]=1/3,1≤i≤3,q[j]=1/4,0≤
j≤3
圖(a):ASLsucc=1/3*3+1/3*2+1/3*1=6/3,
ASLunsucc=1/4*3*2+1/4*2+1/4*1=9/4。
圖(b):
ASLsucc=1/3*2*2+1/3*1=5/3,
ASLunsucc=1/4*2*4=8/4。圖(c):ASLsucc=1/3*1+1/3*2+1/3*3=6/3,
ASLunsucc=1/4*1+1/4*2+1/4*3*2=9/4。圖(d):ASLsucc=1/3*2+1/3*3+1/3*1=6/3,
ASLunsucc=1/4*2+1/4*3*2+1/4*1=9/4。(1)相等搜索概率的情形數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第65頁。662021/4/6
圖(e):ASLsucc=1/3*1+1/3*3+1/3*2=6/3,
ASLunsucc=1/4*1+1/4*3*2+1/4*2=9/4。圖(b)的情形所得的平均搜索長度最小。一般把平均搜索長度達(dá)到最小的擴(kuò)充的二叉搜索樹稱作最優(yōu)二叉搜索樹。在相等搜索概率的情形下,所有內(nèi)部、外部結(jié)點(diǎn)的搜索概率都相等,視它們的權(quán)值都為1。同時(shí),第k層有2k-1個(gè)結(jié)點(diǎn),k=1,2,。則有n個(gè)內(nèi)部結(jié)點(diǎn)的擴(kuò)充二叉搜索樹的內(nèi)部路徑長度I至少等于序列
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第66頁。672021/4/6
0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,…
的前n項(xiàng)的和。因此,最優(yōu)二叉搜索樹的搜索成功的平均搜索長度和搜索不成功的平均搜索長度分別為:數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第67頁。682021/4/6設(shè)二叉搜索樹中所有內(nèi)、外部結(jié)點(diǎn)的搜索概率互不相等。
p[1]=0.5,p[2]=0.1,p[3]=0.05
q[0]=0.15,q[1]=0.1,q[2]=0.05,q[3]=0.05分別計(jì)算各個(gè)可能的擴(kuò)充二叉搜索樹的搜索性能,判斷哪些擴(kuò)充二叉搜索樹的平均搜索長度最小。(2)不相等搜索概率的情形數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第68頁。692021/4/6doiftodoiftoq0=0.15q1=0.1p1=0.5q2=0.05p2=0.1q3=0.05p3=0.05q0=0.15q1=0.1q2=0.05q3=0.05p1=0.5p2=0.1p3=0.05(a)(b)圖(a):ASLsucc=0.5*3+0.1*2+0.05*1=1.75,
ASLunsucc=0.15*3+0.1*3+0.05*2+0.05*1=0.9。圖(b):ASLsucc=0.5*2+0.1*1+0.05*2=1.2,
ASLunsucc=(0.15+0.1+0.05+0.05)*2=0.7。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第69頁。702021/4/6doiftoq0=0.15q1=0.1p1=0.5q2=0.05p2=0.1q3=0.05p3=0.05doiftoq0=0.15q1=0.1p1=0.5q2=0.05p2=0.1q3=0.05p3=0.05(d)(c)圖(c):ASLsucc=0.5*1+0.1*2+0.05*3=0.85,ASLunsucc=0.15*1+0.1*2+0.05*3+0.05*3=0.75.圖(d):ASLsucc=0.5*2+0.1*3+0.05*1=1.35,ASLunsucc=0.15*2+0.1*3+0.05*3+0.05*1=0.8.數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第70頁。712021/4/6由此可知,圖(c)和圖(e)的情形下樹的平均搜索長度達(dá)到最小,因此,圖(c)和圖(e)的情形是最優(yōu)二叉搜索樹。doiftoq0=0.15q1=0.1p1=0.5q2=0.05p2=0.1q3=0.05p3=0.05(e)
圖(e)
:
ASLsucc=0.5*1+0.1*3+0.05*2=0.9;
ASLunsucc=0.15*1+0.1*3+0.05*3+0.05*2=0.7;數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第71頁。722021/4/6最優(yōu)二叉搜索樹在相等搜索概率的情形下,因?yàn)樗袃?nèi)、外部結(jié)點(diǎn)的搜索概率都相等,把它們的權(quán)值都視為1。有n個(gè)內(nèi)部結(jié)點(diǎn)的最優(yōu)二叉搜索樹應(yīng)為完全二叉樹或理想平衡樹。不相等搜索概率情形下的最優(yōu)二叉搜索樹可能不同于完全二叉樹的形態(tài)。考慮在不相等搜索概率情形下如何構(gòu)造最優(yōu)二叉搜索樹。假設(shè)關(guān)鍵碼集合放在一個(gè)有序的順序表中
{key[1],key[2],key[3],…key[n]}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第72頁。732021/4/6設(shè)最優(yōu)二叉搜索樹為T[0][n],其平均搜索長度為:l[i]是內(nèi)部結(jié)點(diǎn)a[i]
所在層次,l‘[j]是外部結(jié)點(diǎn)j所在的層次。C[0][n]是樹的代價(jià)。為計(jì)算方便,將p[i]與q[j]化為整數(shù)。假定:數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第73頁。742021/4/6構(gòu)造最優(yōu)二叉搜索樹構(gòu)造最優(yōu)二叉搜索樹采用自底向上的方法。要構(gòu)造最優(yōu)二叉搜索樹,必須先構(gòu)造它的左子樹和右子樹,它們也是最優(yōu)二叉搜索樹。樹的構(gòu)造從只有一個(gè)結(jié)點(diǎn)的二叉搜索樹開始。對于任一棵子樹T[i][j],它由
{key[i+1],key[i+2],…,key[j]}
組成,其內(nèi)、外部結(jié)點(diǎn)的權(quán)值分別為
{p[i+1],p[i+2],…,p[j]} {q[i],q[i+1],q[i+2],…,q[j]}數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第74頁。752021/4/6使用數(shù)組W[i][j]來存放它的累計(jì)權(quán)值和:
W[i][j]=q[i]+p[i+1]+q[i+1]+p[i+2]++q[i+2]+…+p[j]+q[j].0
i
j
n計(jì)算W[i][j]可以用遞推公式:
W[i][i]=q[i]
//不是二叉樹,只有一個(gè)外部結(jié)點(diǎn)
W[i][i+1]=q[i]+p[i+1]+q[i+1] =W[i][i]+p[i+1]+q[i+1]
//有一個(gè)內(nèi)部結(jié)點(diǎn)及兩個(gè)外部結(jié)點(diǎn)的二叉樹
W[i][i+2]=W[i][i+1]+p[i+2]+q[i+2]
//加一個(gè)內(nèi)部結(jié)點(diǎn)和一個(gè)外部結(jié)點(diǎn)的二叉樹數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第75頁。762021/4/6一般地,
W[i][j]=W[i][j-1]+p[j]+q[j]
//再加一個(gè)內(nèi)部結(jié)點(diǎn)和一個(gè)外部結(jié)點(diǎn)對于一棵包括關(guān)鍵碼
{key[i+1],…,key[k-1],key[k],key[k+1],…,key[j]}
的子樹T[i][j],若設(shè)它的根結(jié)點(diǎn)為k,i<k
j,q[0]p[1]q[1]…q[i]p[i+1]q[i+1]p[i+2]q[i+2]…W[i][i]W[i][i+1]W[i][i+2]數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第76頁。772021/4/6
它的代價(jià)C[i][j]為:
C[i][k-1]+W[i][k-1]+p[k]+C[k][j]+W[k][j]C[i][k-1]是其包含關(guān)鍵碼
{key[i+1],key[i+2],…,key[k-1]}
的左子樹T[i][k-1]的代價(jià)C[i][k-1]+W[i][k-1]等于把左子樹每個(gè)結(jié)點(diǎn)的路徑長度加1而計(jì)算出的代價(jià)C[k][j]是包含關(guān)鍵碼
{key[k+1],key[k+2],…,key[j]}
的右子樹T[k][j]的代價(jià)C[k][j]+W[k][j]是把右子樹每個(gè)結(jié)點(diǎn)的路徑長度加1之后計(jì)算出的代價(jià)。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第77頁。782021/4/6因此,公式
C[i][j]=C[i][k-1]+W[i][k-1]+p[k]+C[k][j]++W[k][j]表明:整個(gè)樹的代價(jià)等于其左子樹的代價(jià)加上其右子樹的代價(jià),再加上根的權(quán)值。因?yàn)?/p>
W[i][j]=p[k]+W[i][k-1]+W[k][j],
故有
C[i][j]=W[i][j]+C[i][k-1]+C[k][j]
可用
k=i+1,i+2,…,j
分別計(jì)算上式,選取使得C[i][j]達(dá)到最小的k。這樣可將最優(yōu)二叉搜索樹T[i][j]構(gòu)造出來。
數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第78頁。792021/4/6構(gòu)造的步驟第一步,構(gòu)造只有一個(gè)內(nèi)部結(jié)點(diǎn)的最優(yōu)二叉搜索樹:T[0][1],T[1][2],…,T[n-1][n]。在T[i-1][i](1
i
n)
中只包含關(guān)鍵碼
key[i]。其代價(jià)分別是
C[i-1][i]=W[i-1][i]。另外設(shè)立一個(gè)數(shù)組
R[0..n][0..n]
存放各最優(yōu)二叉搜索樹的根。
R[0][1]=1,R[1][2]=2,…,R[n-1][n]=n第二步,
構(gòu)造有兩個(gè)內(nèi)部結(jié)點(diǎn)的最優(yōu)二叉搜索樹:T[0][2],T[1][3],…,T[n-2][n]。數(shù)據(jù)結(jié)構(gòu)第七章-搜索結(jié)構(gòu)全文共168頁,當(dāng)前為第79頁。802021/4/6在T[i-2][i]中包含兩個(gè)關(guān)鍵碼
key[i-1],
key[i]。其代價(jià)取分別以key[i-1],key[i]
做根時(shí)計(jì)算出的C[i-2][i]
中的小者。第三步,第四步,…,構(gòu)造有3個(gè)內(nèi)部結(jié)點(diǎn),有4個(gè)內(nèi)部結(jié)點(diǎn),…的最優(yōu)二叉搜索樹。最后構(gòu)造出包含有
n
個(gè)內(nèi)部結(jié)點(diǎn)的最優(yōu)二叉搜索樹。對于這樣的最優(yōu)二叉搜索樹,若設(shè)根為
k,則根
k
的值存于
R[0][n]
中,其代價(jià)存于
C[0][n]
中,左子樹的根存于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融投資居間服務(wù)合同模板
- 2025年度辦公室清潔與生態(tài)環(huán)保技術(shù)應(yīng)用合同
- 住宅買賣中介服務(wù)合同
- 展覽館裝修合同管理費(fèi)方案
- 倉儲(chǔ)服務(wù)居間合同
- 的汽車轉(zhuǎn)讓合同
- 美容化妝品行業(yè)產(chǎn)品追溯與營銷推廣方案
- 數(shù)字化供應(yīng)鏈管理體系建設(shè)方案
- 知識(shí)產(chǎn)權(quán)歸屬及保密協(xié)議南京廖華
- 三農(nóng)村低保申請與審核手冊
- 人教版九年級(jí)英語動(dòng)詞時(shí)態(tài)專項(xiàng)練習(xí)(含答案和解析)
- 蘭州市規(guī)范醫(yī)療服務(wù)價(jià)格項(xiàng)目基準(zhǔn)價(jià)格表
- 2006年度銀行業(yè)金融機(jī)構(gòu)信息科技風(fēng)險(xiǎn)評價(jià)審計(jì)要點(diǎn)
- 反恐C-TPAT程序文件整套(通用)
- 2022年全國高考詩歌鑒賞試題-教學(xué)課件
- 2023-2024學(xué)年浙江省杭州市小學(xué)語文六年級(jí)上冊期末深度自測試題
- GB/T 19868.2-2005基于焊接經(jīng)驗(yàn)的工藝評定
- 機(jī)房巡檢記錄表
- 警燈、警報(bào)器使用證申請表
- (中職)電梯維護(hù)與保養(yǎng)項(xiàng)目九 電梯曳引系統(tǒng)的維護(hù)與保養(yǎng)教學(xué)課件
- 中國科學(xué)院率先行動(dòng)計(jì)劃組織實(shí)施方案
評論
0/150
提交評論