數(shù)據(jù)結(jié)構(gòu)殷人昆培訓(xùn)課件_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)殷人昆培訓(xùn)課件_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)殷人昆培訓(xùn)課件_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)殷人昆培訓(xùn)課件_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)殷人昆培訓(xùn)課件_第5頁(yè)
已閱讀5頁(yè),還剩369頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)清華大學(xué)殷人昆數(shù)據(jù)結(jié)構(gòu)清華大學(xué)殷人昆1數(shù)據(jù)結(jié)構(gòu)清華大學(xué)殷人昆2數(shù)據(jù)結(jié)構(gòu)清華大學(xué)殷人昆2樹(shù)的定義與基本概念二叉樹(shù)二叉樹(shù)遍歷二叉樹(shù)的計(jì)數(shù)線索二叉樹(shù)樹(shù)與樹(shù)的遍歷樹(shù)的應(yīng)用第4章樹(shù)與二叉樹(shù)樹(shù)的定義與基本概念第4章樹(shù)與二叉樹(shù)樹(shù)和森林的概念樹(shù)的定義

樹(shù)是由n(n>0)個(gè)結(jié)點(diǎn)組成的有限集合:有一個(gè)特定的稱之為根(root)的結(jié)點(diǎn);除根以外的其它結(jié)點(diǎn)劃分為m(m≥0)個(gè)互不相交的有限集合T1,T2,…,Tm,每個(gè)集合又是一棵樹(shù),并且稱之為根的子樹(shù)。此定義是離散數(shù)學(xué)和圖論中給出的。它們把樹(shù)視為圖的一個(gè)極小連通子圖。有n個(gè)結(jié)點(diǎn)的樹(shù)有n-1條邊,而且不能有回路。樹(shù)和森林的概念樹(shù)的定義這種觀點(diǎn)的典型代表是

Knuth。他認(rèn)為圖至少有一個(gè)頂點(diǎn),樹(shù)也必須至少有一個(gè)頂點(diǎn)。樹(shù)不能是空樹(shù),但N叉樹(shù)可以是空樹(shù)。N叉樹(shù)是限制根的子樹(shù)最多不能超過(guò)N棵的樹(shù)。隨著對(duì)樹(shù)討論的深入,人們放寬了對(duì)樹(shù)結(jié)構(gòu)的限制。若把樹(shù)當(dāng)作層次結(jié)構(gòu)單獨(dú)對(duì)待,樹(shù)中允許結(jié)點(diǎn)個(gè)數(shù)為0。這樣,樹(shù)與N叉樹(shù)就沒(méi)有不可逾越的鴻溝了。從面向?qū)ο笥^點(diǎn),N叉樹(shù)是樹(shù)的特殊實(shí)現(xiàn):樹(shù)是父類,N叉樹(shù)是子類。N叉樹(shù)繼承了樹(shù)的特性,它還有自己增加的特性,例如這種觀點(diǎn)的典型代表是Knuth。他認(rèn)為圖至少有一個(gè)頂點(diǎn),樹(shù)理論上樹(shù)不可是空樹(shù),N叉樹(shù)可以是空樹(shù);樹(shù)的子樹(shù)可以有序,也可以不要求有序,而N叉樹(shù)的子樹(shù)必須有序。N叉樹(shù)的定義也是遞歸的,遞歸到空樹(shù)終止;樹(shù)則遞歸到只有一個(gè)結(jié)點(diǎn)的子樹(shù)。樹(shù)的子樹(shù)棵數(shù)不限,而N叉樹(shù)中根的子樹(shù)最多N棵。樹(shù)可以區(qū)分為外向樹(shù)和內(nèi)向樹(shù),而N叉樹(shù)一般是外向樹(shù),即邊是有向的,從父指向子。樹(shù)可以用N叉樹(shù)實(shí)現(xiàn)。二叉樹(shù)、B樹(shù)等又都是N叉樹(shù)的特殊情形。理論上樹(shù)不可是空樹(shù),N叉樹(shù)可以是空樹(shù);樹(shù)的特點(diǎn)樹(shù)是分層結(jié)構(gòu),又是遞歸結(jié)構(gòu)。每棵子樹(shù)的根結(jié)點(diǎn)有且僅有一個(gè)直接前驅(qū),但可以有0個(gè)或多個(gè)直接后繼。1層2層4層3層depth=4height=4ACGBDEFKLHMIJ前驅(qū)后繼樹(shù)的特點(diǎn)樹(shù)是分層結(jié)構(gòu),又是遞歸結(jié)構(gòu)。每棵子樹(shù)的根結(jié)點(diǎn)有且僅有1層2層4層3層depth=4height=4ACGBDEFKLHMIJ結(jié)點(diǎn)結(jié)點(diǎn)的度分支結(jié)點(diǎn)葉結(jié)點(diǎn)子女雙親兄弟祖先樹(shù)的度樹(shù)深度樹(shù)高度森林子孫結(jié)點(diǎn)層次結(jié)點(diǎn)深度結(jié)點(diǎn)高度1層2層4層3層depth=4ACGBDEFKLHMIJ注意,結(jié)點(diǎn)的深度和結(jié)點(diǎn)的高度是不同的。結(jié)點(diǎn)的深度即結(jié)點(diǎn)所處層次,是從根向下逐層計(jì)算的;結(jié)點(diǎn)的高度是從下向上逐層計(jì)算的:葉結(jié)點(diǎn)的高度為1,其他結(jié)點(diǎn)的高度是取它的所有子女結(jié)點(diǎn)最大高度加一。樹(shù)的深度與高度相等。 樹(shù)的深度按離根最遠(yuǎn)的 葉結(jié)點(diǎn)算,樹(shù)的高度按 根結(jié)點(diǎn)算,都是6。葉結(jié)點(diǎn)也稱為終端結(jié)點(diǎn), 非葉結(jié)點(diǎn)也稱為非終端 結(jié)點(diǎn)。ABCDEFGHILKJ高度=4深度=3注意,結(jié)點(diǎn)的深度和結(jié)點(diǎn)的高度是不同的。結(jié)點(diǎn)的深度即結(jié)點(diǎn)所處層二叉樹(shù)的五種不同形態(tài)LLRR二叉樹(shù)(BinaryTree)二叉樹(shù)的定義 一棵二叉樹(shù)是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根結(jié)點(diǎn)加上兩棵分別稱為左子樹(shù)和右子樹(shù)的、互不相交的二叉樹(shù)組成。這個(gè)定義是遞歸的。二叉樹(shù)的五種不同形態(tài)LLRR二叉樹(shù)(BinaryTree二叉樹(shù)的性質(zhì)性質(zhì)1

若二叉樹(shù)的層次從1開(kāi)始,則在二叉樹(shù)的第i層最多有2i-1

個(gè)結(jié)點(diǎn)。(i≥1)[證明用數(shù)學(xué)歸納法]i=1時(shí),根結(jié)點(diǎn)只有1個(gè),21-1=20=1;若設(shè)i=k

時(shí)性質(zhì)成立,即該層最多有2k-1

個(gè)結(jié)點(diǎn),則當(dāng)i=k+1時(shí),由于第k

層每個(gè)結(jié)點(diǎn)最多可有2個(gè)子女,第k+1層最多結(jié)點(diǎn)個(gè)數(shù)可有2*2k-1=2k

個(gè),故性質(zhì)成立。二叉樹(shù)的性質(zhì)性質(zhì)1性質(zhì)2高度為h的二叉樹(shù)最多有2h

-1個(gè)結(jié)點(diǎn)。(h≥1)[證明用求等比級(jí)數(shù)前k項(xiàng)和的公式] 高度為h的二叉樹(shù)有h

層,各層最多結(jié)點(diǎn)個(gè)數(shù)相加,得到等比級(jí)數(shù),求和得: 20+21+22+…+2h-1=2h-1

空樹(shù)的高度為0,只有根結(jié)點(diǎn)的樹(shù)的高度為1。性質(zhì)2性質(zhì)3

對(duì)任何一棵二叉樹(shù),如果其葉結(jié)點(diǎn)有n0

個(gè),度為2的非葉結(jié)點(diǎn)有n2

個(gè),則有

n0=n2+1證明: 若設(shè)度為1的結(jié)點(diǎn)有n1個(gè),總結(jié)點(diǎn)個(gè)數(shù)為n,總邊數(shù)為e,則根據(jù)二叉樹(shù)的定義,

n=n0+n1+n2e=2n2+n1=n-1 因此,有2n2+n1=n0+n1+n2-1 n2=n0-1n0=n2+1

引申:可用于判斷二叉樹(shù)各類結(jié)點(diǎn)個(gè)數(shù)。性質(zhì)34.1.2安全生產(chǎn)管理的基本知識(shí)、方法與安全生產(chǎn),有關(guān)行業(yè)安全生4.注意眼神【案例】服務(wù)是一種行動(dòng),是做出來(lái)能夠使顧客感受得到的東西。提升服務(wù)者的心理素質(zhì),使他們主動(dòng)、積極、熱忱、開(kāi)放,才能為客戶提供貼心服務(wù)。通過(guò)潛能激發(fā)訓(xùn)練可以提升服務(wù)者的心理素質(zhì),包括觀念、心態(tài)和行為技術(shù)的改進(jìn)和提高。3.1經(jīng)評(píng)標(biāo)委員會(huì)評(píng)議認(rèn)定有下列情形之一的,屬于投標(biāo)人相互串通投標(biāo):(4)本標(biāo)書第二章“前附表”中規(guī)定的其他驗(yàn)收方式。4.7.3崗位安全操作規(guī)程,生產(chǎn)設(shè)備、安全裝置、勞動(dòng)防護(hù)用品的性能及正確使用方法,事故案例27.4招標(biāo)代理機(jī)構(gòu)將按本須知第27.2條的內(nèi)容作開(kāi)標(biāo)記錄,存檔備查。10.6在質(zhì)量保證期內(nèi),如果發(fā)現(xiàn)由于賣方責(zé)任造成貨物的質(zhì)量或規(guī)格與合同不符,或證實(shí)貨物是有缺陷的,包括潛在的缺陷或使用不符合要求的材料等,或由于賣方技術(shù)文件錯(cuò)誤或賣方人員在安裝、調(diào)試、試運(yùn)行和驗(yàn)收過(guò)程中錯(cuò)誤指導(dǎo)而導(dǎo)致貨物損壞,買方可以根據(jù)本合同的規(guī)定以書面形式向賣方提出補(bǔ)救措施或索賠。32.1評(píng)標(biāo)委員會(huì)在初審時(shí)將檢查其報(bào)價(jià)是否有算術(shù)錯(cuò)誤,對(duì)價(jià)格的算術(shù)錯(cuò)誤按下述原則修正。修正后的結(jié)果對(duì)投標(biāo)人有約束力,如投標(biāo)人不接受修正后的結(jié)果,則其投標(biāo)將被拒絕,投標(biāo)保證金將不予退還。定義1

滿二叉樹(shù)(FullBinaryTree)定義2

完全二叉樹(shù)(CompleteBinaryTree)若設(shè)二叉樹(shù)的高度為h,則共有h

層。除第

h

層外,其它各層(1~h-1)的結(jié)點(diǎn)數(shù)都達(dá)到最大個(gè)數(shù),第h

層從右向左連續(xù)缺若干結(jié)點(diǎn),這就是完全二叉樹(shù)。4.1.2安全生產(chǎn)管理的基本知識(shí)、方法與安全生產(chǎn),有關(guān)行業(yè)安性質(zhì)4 具有n(n≥0)個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的高度為 log2(n+1)

證明:設(shè)完全二叉樹(shù)的高度為h,則有

2h-1-1<n

≤2h-1

上面h-1層結(jié)點(diǎn)數(shù)

包括第h層的最大結(jié)點(diǎn)數(shù)變形 2h-1<n+1≤2h

取對(duì)數(shù)

h-1<log2(n+1)≤h

有 h=log2(n+1)

23-124-1性質(zhì)423-124-123-124-1注意:求高度的另一公式為log2n+1,此公式對(duì)于n=0不適用。若設(shè)完全二叉樹(shù)中葉結(jié)點(diǎn)有n0

個(gè),則該二叉樹(shù)總的結(jié)點(diǎn)數(shù)為n=2n0,或n=2n0–1。若完全二叉樹(shù)的結(jié)點(diǎn)數(shù)為奇數(shù),沒(méi)有度為1的結(jié)點(diǎn);為偶數(shù),有一個(gè)度為1的結(jié)點(diǎn)。右圖為理想平衡樹(shù), 上層都是滿的,第

h層結(jié)點(diǎn)分布在各 處。23-124-1注意:性質(zhì)5

如將一棵有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)自頂向下,同一層自左向右連續(xù)給結(jié)點(diǎn)編號(hào):0,1,2,…,n-1,則有以下關(guān)系:若i=0,則i無(wú)雙親; 若i>0,則i的雙親為(i-1)/2。若2*i+1<n,則

i

的左子女為2*i+1; 若2*i+2<n,則i的右子女為2*i+2。若i

為偶數(shù),且i!=0,則 其左兄弟為i-1; 若i

為 奇數(shù),且i!=n-1,

則其右兄弟為i+1。0123745689性質(zhì)50123745689注意:

如果完全二叉樹(shù)各層次結(jié)點(diǎn)從1開(kāi)始編號(hào):1,2,3,…,n,則有以下關(guān)系:若i=1,則i

無(wú)雙親; 若i>1,則i的雙親為i/2。若2*i<=n,則i的左子女為2*i; 若2*i+1<=n,則i的右子女為2*i+1若i

為奇數(shù),且i!=1,

則其左兄弟為i-1; 若i為偶數(shù),且i!=n,

則其右兄弟為i+1。12348567910注意:12348567910完全二叉樹(shù)一般二叉樹(shù)的順序表示的順序表示00123456789130123567811131378945620126537811491012二叉樹(shù)的順序表示完全二叉樹(shù)一般二叉樹(shù)00123402614300261430極端情形:只有右單支的二叉樹(shù)對(duì)于完全二叉樹(shù),因結(jié)點(diǎn)編號(hào)連續(xù),數(shù)據(jù)存儲(chǔ)密集,適于用順序表示;對(duì)于一般二叉樹(shù),用鏈表表示較好;02614300261430極端情形:只有右單支的二叉樹(shù)對(duì)lchilddatarchilddatalchildrchild左子女指針右子女指針二叉樹(shù)的二叉鏈表表示使用二叉鏈表,找子女的時(shí)間復(fù)雜度為O(1),找雙親的時(shí)間復(fù)雜度為O(log2i)~O(i),其中,i

是該結(jié)點(diǎn)編號(hào)。lchilddatarchilddalchilddataparentrchildparentdatalchildrchild左子女指針雙親指針右子女指針二叉樹(shù)的三叉鏈表表示使用三叉鏈表,找子女、雙親的時(shí)間都是O(1)。lchilddataparentrAAABBBCCCDDDFFFEEErootrootroot二叉樹(shù)二叉鏈表三叉鏈表二叉樹(shù)鏈表表示的示例AAABBBCCCDDDFFF二叉樹(shù)的定義typedefcharTElemType; //樹(shù)結(jié)點(diǎn)數(shù)據(jù)類型typedefstructnode{ //樹(shù)結(jié)點(diǎn)定義

TElemType

data; //結(jié)點(diǎn)數(shù)據(jù)域

structnode*lchild,*rchild;

//子女指針域}BiTNode;typedefBiTNode*BinTree;

//樹(shù)定義,代表樹(shù)的根指針

二叉樹(shù)的定義typedefcharTElemType;二叉樹(shù)遍歷樹(shù)的遍歷就是按某種次序訪問(wèn)樹(shù)中的結(jié)點(diǎn),要求每個(gè)結(jié)點(diǎn)訪問(wèn)一次且僅訪問(wèn)一次。設(shè)訪問(wèn)根結(jié)點(diǎn)記作V,遍歷根的左子樹(shù)記作L,遍歷根的右子樹(shù)記作R,則可能的遍歷次序有前序VLR鏡像VRL中序LVR鏡像RVL后序LRV鏡像RLV二叉樹(shù)遍歷樹(shù)的遍歷就是按某種次序訪問(wèn)樹(shù)中的結(jié)點(diǎn),要求每個(gè)結(jié)點(diǎn)20.3為買方方便而終止合同3.手部的修飾與保養(yǎng)4.1禁止敲擊,正確操作。充裝可燃?xì)怏w的氣瓶注意防止產(chǎn)生靜電,開(kāi)關(guān)瓶閥時(shí)不得用鐵扳手等敲擊。高壓氣瓶開(kāi)閥時(shí)應(yīng)緩慢開(kāi)啟。(1)按“競(jìng)爭(zhēng)性磋商響應(yīng)人競(jìng)爭(zhēng)性磋商響應(yīng)前須知”注明的時(shí)間、地址送達(dá);做好服務(wù)技巧的強(qiáng)化訓(xùn)練,要從以下幾個(gè)方面入手:9.4.4成交供應(yīng)商未按磋商文件要求交納履約保證金的;7.3競(jìng)爭(zhēng)性磋商響應(yīng)幣種為人民幣10.1采購(gòu)代理機(jī)構(gòu)應(yīng)當(dāng)在評(píng)審結(jié)束后2個(gè)工作日內(nèi)將評(píng)審報(bào)告送采購(gòu)人確認(rèn)。5.1貨物交貨地點(diǎn)及時(shí)間見(jiàn)本標(biāo)書第二章“前附表”中的相關(guān)規(guī)定。7.3做好壓力容器和消防器材的定期檢驗(yàn)工作,發(fā)現(xiàn)問(wèn)題及時(shí)解決并向站長(zhǎng)匯報(bào)。17.1如果本標(biāo)書第二章“前附表”中允許投標(biāo)人提交備選方案的,投標(biāo)人可以除按招標(biāo)文件規(guī)定提交主選方案外,再提交備選方案,且須注明主選方案與備選方案,如未注明則以開(kāi)標(biāo)時(shí)唱出的第一個(gè)方案為主選方案。備選方案應(yīng)說(shuō)明與主選方案的差異,與主選方案一樣完整,并實(shí)質(zhì)性響應(yīng)招標(biāo)文件的要求。10.1賣方應(yīng)保證合同項(xiàng)下所供貨物是全新的、未使用過(guò)的,技術(shù)水平是先進(jìn)的、成熟的,并完全符合合同規(guī)定的數(shù)量、質(zhì)量、工藝、設(shè)計(jì)、型式、規(guī)格和技術(shù)性能,滿足合同技術(shù)規(guī)范的要求。賣方還須保證,合同項(xiàng)下提供的全部貨物不存在設(shè)計(jì)、材料或工藝上的缺陷。貨物在其正確安裝、正常使用和保養(yǎng)條件下,在其使用壽命期內(nèi)應(yīng)具有滿意的性能。其次是選拔服務(wù)禮儀師,也可稱為行銷服務(wù)師或總講師進(jìn)行培訓(xùn)。他在分支機(jī)構(gòu)主管的管理下工作,進(jìn)行全員教育訓(xùn)練。服務(wù)禮儀師的存在是必要的,他往往能夠起到企業(yè)文化傳承的作用。中序遍歷二叉樹(shù)算法的框架是:若二叉樹(shù)為空,則空操作;否則中序遍歷左子樹(shù)(L);訪問(wèn)根結(jié)點(diǎn)(V);中序遍歷右子樹(shù)(R)。遍歷結(jié)果

a+b*c-d-e/f中序遍歷(InorderTraversal)--/+*abcdef20.3為買方方便而終止合同中序遍歷二叉樹(shù)算法的框架是:二叉樹(shù)遞歸的中序遍歷算法voidInOrder(BiTNode*T){

if(T!=NULL){InOrder(T->lchild);visit(T->data);InOrder(T->rchild);

}}visit()是輸出數(shù)據(jù)值的操作,在實(shí)際使用時(shí)可用相應(yīng)的操作來(lái)替換。二叉樹(shù)遞歸的中序遍歷算法voidInOrder(BiT前序遍歷二叉樹(shù)算法的框架是:若二叉樹(shù)為空,則空操作;否則訪問(wèn)根結(jié)點(diǎn)(V);前序遍歷左子樹(shù)(L);前序遍歷右子樹(shù)(R)。遍歷結(jié)果

-+a*b-cd/ef前序遍歷(PreorderTraversal)--/+*abcdef前序遍歷二叉樹(shù)算法的框架是:前序遍歷(PreorderT二叉樹(shù)遞歸的前序遍歷算法voidPreOrder(BiTNode*T){

if(T!=NULL){visit(T->data);PreOrder(T->lchild);PreOrder(T->rchild);

}}與中序遍歷算法相比,visit()操作放在兩個(gè)子樹(shù)遞歸前序遍歷的最前面。二叉樹(shù)遞歸的前序遍歷算法voidPreOrder(BiT后序遍歷二叉樹(shù)算法的框架是:若二叉樹(shù)為空,則空操作;否則后序遍歷左子樹(shù)(L);后序遍歷右子樹(shù)(R);訪問(wèn)根結(jié)點(diǎn)(V)。遍歷結(jié)果

abcd-*+ef/-后序遍歷(PostorderTraversal)d--/+*abcdef后序遍歷二叉樹(shù)算法的框架是:后序遍歷(Postorder二叉樹(shù)遞歸的后序遍歷算法voidPostOrder(BiTNode*T){

if(T!=NULL){PostOrder(T->lchild);PostOrder(T->rchild);visit(T->data);

}}與中序遍歷算法相比,visit()操作放在兩個(gè)子樹(shù)遞歸前序遍歷的最后面。二叉樹(shù)遞歸的后序遍歷算法voidPostOrder(Bi計(jì)算二叉樹(shù)結(jié)點(diǎn)個(gè)數(shù)的遞歸算法應(yīng)用二叉樹(shù)遍歷的事例intCount(BiTNode*T){

if(T==NULL)return0;

else

return1+Count(T->lchild)+Count(T->rchild);}空二叉樹(shù)的結(jié)點(diǎn)個(gè)數(shù)為0,可直接計(jì)算;否則可分別計(jì)算左、右子樹(shù)的結(jié)點(diǎn)個(gè)數(shù),再相加得到總結(jié)點(diǎn)個(gè)數(shù)。計(jì)算二叉樹(shù)結(jié)點(diǎn)個(gè)數(shù)的遞歸算法應(yīng)用二叉樹(shù)遍歷的事例intCo求二叉樹(shù)高度的遞歸算法intHeight(BiTNode*T){if(T==NULL)return0;

else{intm=

Height(T->lchild);intn=

Height(T->rchild));return(m>n)?m+1:n+1;

}空樹(shù)的高度為0;非空樹(shù)情形,先計(jì)算根結(jié)點(diǎn)左右子樹(shù)的高度,取大者再加一得到二叉樹(shù)高度。求二叉樹(shù)高度的遞歸算法intHeight(BiTNoabcecdcc訪問(wèn)a進(jìn)棧c左進(jìn)b訪問(wèn)b進(jìn)棧d左進(jìn)空退棧d訪問(wèn)d左進(jìn)空退棧c訪問(wèn)c左進(jìn)e訪問(wèn)e左進(jìn)空退棧結(jié)束利用棧的前序遍歷的非遞歸算法ddcabcecdc訪問(wèn)訪問(wèn)退棧退棧訪問(wèn)結(jié)束利用棧的前序遍voidPreOrder(BinTreeT){stackS;InitStack(S);

//遞歸工作棧

BiTNode*p=T;Push(S,NULL);

while(p!=NULL){visit(p->data);if(p->rchild!=NULL)Push(S,p->rchild);if(p->lchild!=NULL)p=p->lchild; //進(jìn)左子樹(shù)

elsePop(S,p); //左子樹(shù)空,進(jìn)右子樹(shù)

}}

voidPreOrder(BinTreeT){abcdebaadaa左空退棧訪問(wèn)左空退棧訪問(wèn)退棧訪問(wèn)左空ec退棧訪問(wèn)cc右空退棧訪問(wèn)??战Y(jié)束利用棧的中序遍歷的非遞歸算法abcdebada左空退棧左空退棧退棧左空e退棧訪問(wèn)cc右空

voidInOrder(BinTreeT){stackS;InitStack(S);//遞歸工作棧

BiTNode*p=

T;

//初始化

do{

while(p!=NULL) //子樹(shù)非空找中序第一個(gè)

{Push(S,p);p=p->lchild;}//邊找邊進(jìn)棧

if(!StackEmpty(S)){

//棧非空

Pop(S,p);//子樹(shù)中序第一個(gè)退棧

visit(p->data);

//訪問(wèn)之

p=p->rchild; //向右子樹(shù)走

}

}while(p!=NULL||!StackEmpty(S));}voidInOrder(BinTreeT)后序遍歷時(shí)使用的棧的結(jié)點(diǎn)定義

typedefstruct

{ BiTNode*ptr; //結(jié)點(diǎn)指針

enumtag{L,R};//該結(jié)點(diǎn)退棧標(biāo)記 }StackNode;

根結(jié)點(diǎn)的tag=L,表示從左子樹(shù)退出,訪問(wèn)右子樹(shù)。tag=R,表示從右子樹(shù)退出,訪問(wèn)根。ptrtag{L,R}

利用棧的后序遍歷的非遞歸算法后序遍歷時(shí)使用的棧的結(jié)點(diǎn)定義ptrtag{L,R這家醫(yī)院的每部電梯里都有相應(yīng)的指示地圖,這種服務(wù)讓病人對(duì)醫(yī)院的滿意度大為提高?!颈局v小結(jié)】14.3若上述變更不引起賣方履行合同義務(wù)的費(fèi)用或時(shí)間的實(shí)質(zhì)性變化時(shí),合同的價(jià)格或交貨時(shí)間將不予調(diào)整,但也需賣方書面確認(rèn)。7、其它資料。收款單位:法正項(xiàng)目管理集團(tuán)有限公司青海分公司②可以和醫(yī)生正面接觸。(2)投標(biāo)人未按招標(biāo)文件要求提供資格證明文件或提供的有關(guān)資格、資質(zhì)文件不真實(shí);1.1為提高企業(yè)生產(chǎn)與質(zhì)量管理水平,確保使用科學(xué)、有效的統(tǒng)計(jì)方法,及時(shí)準(zhǔn)確地了解生產(chǎn)與質(zhì)量情況,為指導(dǎo)生產(chǎn)、改善經(jīng)營(yíng)、預(yù)測(cè)決策提供可靠的依據(jù),特制訂本制度;【案例】(二)團(tuán)組織申報(bào)。擬進(jìn)行換屆的團(tuán)組織,向同級(jí)黨組織和上級(jí)團(tuán)委提出開(kāi)展競(jìng)爭(zhēng)上崗的申請(qǐng),經(jīng)同意后按照領(lǐng)導(dǎo)小組辦公室的統(tǒng)一安排組織實(shí)施。15.1除了第14條的規(guī)定之外,不應(yīng)對(duì)合同條款進(jìn)行任何變更或修改,除非雙方同意并簽署書面的合同修改協(xié)議,成為本合同不可分割的組成部分,具有與本合同同樣的效力。5.1.2統(tǒng)計(jì)方法選定的原則abcdeaLbLaLbRaLdLbRaLdRbRaLbRaLaLaReLcLaReRcLaRcLaRcRaRaR這家醫(yī)院的每部電梯里都有相應(yīng)的指示地圖,這種服務(wù)讓病人對(duì)醫(yī)院利用棧的后序遍歷的非遞歸算法voidPostOrder(BinTreeT){stackS;InitStack(S);StackNode

w;BiTNode*p=T;

do{

while(p!=NULL){ //向左子樹(shù)走

w.ptr=p;w.tag=L;Push(S,w);

p=p->lchild; }

intsucc=1; //繼續(xù)循環(huán)標(biāo)記利用棧的后序遍歷的非遞歸算法voidPostOrder(B

while(succ&&!StackEmpty(S)){Pop(S,w);p=w.ptr;

switch(w.tag){

//判斷棧頂tag標(biāo)記

caseL:w.tag=R;Push(S,w); succ=0;

p=p->rchild;break; caseR:visit(p->data);

}}}

while(!StackEmpty(S));}while(succ&&!StackEmpt二叉樹(shù)的計(jì)數(shù)由二叉樹(shù)的前序序列和中序序列可唯一地確定一棵二叉樹(shù)。例,前序序列{ABHFDECKG}和中序序列{HBDFAEKCG},構(gòu)造二叉樹(shù)過(guò)程如下:HBDFEKCGAEKCGABHDF二叉樹(shù)的計(jì)數(shù)由二叉樹(shù)的前序序列和中序序列可唯一地確定一棵二叉KCGEKCGABHDFEKCGABHFDEABHFDEABHFDCKGKCGEKCGABHDFEKCGABHFDEABHFDEAB612345789612375849如果前序序列固定不變,給出不同的中序序列,可得到不同的二叉樹(shù)。問(wèn)題是:固定前序排列,選擇所有可能的中序排列,可以構(gòu)造出多少種不同的二叉樹(shù)?612345789612375849如果前序序列固定不變,給123123123123123例如,有3個(gè)數(shù)據(jù){1,2,3},可得5種不同的二叉樹(shù)。它們的前序排列均為123,中序序列可能是123,132,213,231,321。那么,如何推廣到一般情形呢?首先,只有一個(gè)結(jié)點(diǎn)的不同二叉樹(shù)只有一個(gè);有2個(gè)結(jié)點(diǎn)的不同二叉樹(shù)只有2種,其他情況呢?123123123123123例如,有3個(gè)數(shù)據(jù){b0=1b1=1b2=2b3=5

b4=14有0個(gè),1個(gè),2個(gè),3個(gè)結(jié)點(diǎn)的不同二叉樹(shù)如下b0=1b1=1b2=2b3=5b4=14bibn-i-11計(jì)算具有n個(gè)結(jié)點(diǎn)的不同二叉樹(shù)的棵數(shù)Catalan函數(shù)例bibn-i-11計(jì)算具有n個(gè)結(jié)點(diǎn)的不同二叉樹(shù)的棵數(shù)Ca線索二叉樹(shù)(ThreadedBinaryTree)又稱為穿線樹(shù)。通過(guò)二叉樹(shù)遍歷,可將二叉樹(shù)中所有結(jié)點(diǎn)的數(shù)據(jù)排列在一個(gè)線性序列中,可以找到某數(shù)據(jù)在這種排列下它的前驅(qū)和后繼。希望不必每次都通過(guò)遍歷找出這樣的線性序列。只要事先做預(yù)處理,將某種遍歷順序下的前驅(qū)、后繼關(guān)系記在樹(shù)的存儲(chǔ)結(jié)構(gòu)中,以后就可以高效地找出某結(jié)點(diǎn)的前驅(qū)、后繼。為此,在二叉樹(shù)存儲(chǔ)結(jié)點(diǎn)中增加線索信息。線索二叉樹(shù)(ThreadedBinaryTree)又稱線索(Thread)增加前驅(qū)Pred指針和后繼Succ指針的二叉樹(shù)predlchilddatarchildsuccabcdepredpredpredsuccsuccsuccD∧∧AE∧∧B∧∧C∧∧rootpredpredpredpredsuccsuccsuccsucc線索(Thread)增加前驅(qū)Pred指針和后繼Succ指針這種設(shè)計(jì)的缺點(diǎn)是每個(gè)結(jié)點(diǎn)增加兩個(gè)指針,當(dāng)結(jié)點(diǎn)數(shù)很大時(shí)存儲(chǔ)消耗較大。改造樹(shù)結(jié)點(diǎn),將pred指針和succ指針壓縮到lchild和rchild的空閑指針中,并增設(shè)兩個(gè)標(biāo)志ltag和rtag,指明指針是指示子女還是前驅(qū)/后繼。后者稱為線索。ltag(或rtag)=0,表示相應(yīng)指針指示左子女(或右子女結(jié)點(diǎn));ltag(或rtag)=1,表示相應(yīng)指針為前驅(qū)(或后繼)線索。lchildltagdatartagrchild

這種設(shè)計(jì)的缺點(diǎn)是每個(gè)結(jié)點(diǎn)增加兩個(gè)指針,當(dāng)結(jié)點(diǎn)數(shù)很大時(shí)存儲(chǔ)消耗中序線索二叉樹(shù)及其鏈表表示lchildltagdatartagrchild

abcdepredpredpredsuccsuccsuccDAEB∧C∧rootpredpredsuccsucc0000111111中序線索二叉樹(shù)及其鏈表表示lchildltagtypedefintTTElemType;typedefstructnode{

intltag,rtag;

structnode*lchild,*rchild;

TTElemTypedata;}ThreadNode,*ThreadTree;注意,線索二叉樹(shù)在樹(shù)結(jié)點(diǎn)中增加了ltag和rtag,改變了二叉樹(shù)的結(jié)構(gòu)。線索二叉樹(shù)的結(jié)構(gòu)定義typedefintTTElemType;線索二叉樹(shù)的通過(guò)中序遍歷建立中序線索二叉樹(shù)voidInThread(ThreadNode*t,

ThreadNode*&pre){

//預(yù)設(shè)了一個(gè)pre指針,指示t的中序前驅(qū),在主

//程序中預(yù)置為NULL

if(t!=NULL){ InThread(t->lchild,pre);

//遞歸,左子樹(shù)線索化

if(t->lchild==NULL){ t->lchild=pre;t->ltag=1;}

//建立當(dāng)前結(jié)點(diǎn)t的前驅(qū)線索

通過(guò)中序遍歷建立中序線索二叉樹(shù)voidInThread(

if(pre&&pre->rchild==NULL){pre->rchild=t;pre->rtag=1;

}

//建立前驅(qū)結(jié)點(diǎn)pre的后繼線索

pre=t; //前驅(qū)跟上當(dāng)前指針

InThread(t->rchild,pre);

//遞歸,右子樹(shù)線索化

}}使用此函數(shù)可以把以t為根的子樹(shù)一次中序線索化,但中序下最后一個(gè)結(jié)點(diǎn)的后繼線索沒(méi)有加上,指針

pre

在退出時(shí)正在指示這一結(jié)點(diǎn)。if(pre&&pre->rchivoidCreateInThread(ThreadTreeT){ThreadNode*pre=NULL; //前驅(qū)指針

if(T!=NULL){

//樹(shù)非空,線索化

InThread(T,pre); //中序遍歷線索二叉樹(shù)

pre->rchild=NULL;pre->rtag=1;

//后處理,中序最后一個(gè)結(jié)點(diǎn)

}}通過(guò)該主程序?qū)崿F(xiàn)了對(duì)二叉樹(shù)的中序線索化。它是基于二叉樹(shù)的中序遍歷實(shí)現(xiàn)的。voidCreateInThread(ThreadTre0A00B0

0C00D00E0Tpre==NULLt0A00B00A01B0

0C00D00E0Tpre==NULLt0A01B00A01B0

0C0

1D00E0Tpret0A01B00A01B0

0C0

1D10E0Tpret0A01B00A01B0

0C0

1D11E0Tpret0A01B00A01B0

0C0

1D11E1Tpret0A01B00A01B0

0C1

1D11E1Tpre后處理0A01B0尋找結(jié)點(diǎn)p在中序下的后繼if(p->rtag==1)

后繼為

p->rchildelse

//p->rtag!=1

后繼為結(jié)點(diǎn)

p右子樹(shù)

q中的中序下的第一個(gè)結(jié)點(diǎn)ABDECFHIKGJ尋找結(jié)點(diǎn)p在中序下的后繼if(p->rtag==1)ThreadNode

*First(ThreadNode

*t){//函數(shù)返回以*t為根的線索二叉樹(shù)中的中序序列下//的第一個(gè)結(jié)點(diǎn)

ThreadNode*p=t;

while(p->ltag==0)p=p->lchild;

returnp; //最左下的結(jié)點(diǎn)}ThreadNode*Next(ThreadNode

*p){//函數(shù)返回在線索二叉樹(shù)中結(jié)點(diǎn)*p在中序下的后//繼結(jié)點(diǎn)ThreadNode*First(ThreadNod

if(p->rtag==0)returnFirst(p->rchild);

//p->rtag==0,后繼為右子樹(shù)中序第一個(gè)結(jié)點(diǎn)

else

returnp->rchild;

//p->rtag==1,直接返回后繼線索}voidInorder(ThreadNode*t){//以t為根的線索二叉樹(shù)的中序遍歷

ThreadNode*p;for(p=First(t);p!=NULL;p=Next(p))

cout<<p->data<<endl;}

if(p->rtag==0)retur尋找結(jié)點(diǎn)p在中序下的前驅(qū)if(p->ltag==1)

前驅(qū)為

p->lchildelse

//p->leftThread==0

前驅(qū)為結(jié)點(diǎn)

p左子樹(shù)中序下的最后一個(gè)結(jié)點(diǎn)ABDECFHIKGJL尋找結(jié)點(diǎn)p在中序下的前驅(qū)if(p->ltag==1)A前序序列

ABDCEp->ltag==1?前驅(qū)線索

=左子女p->rchild==NULL后繼為p->lchild=無(wú)后繼

后繼為p->rchildABCED前序線索二叉樹(shù)在前序線索二叉樹(shù)中尋找當(dāng)前結(jié)點(diǎn)的后繼前序序列p->ltag==1?前驅(qū)線索=左后序序列

DBECAp->rtag==1?后繼線索

=右子女后繼為q的右子樹(shù)中后序下第一個(gè)結(jié)點(diǎn)

后繼為p->rchild=無(wú)后繼

后繼為qABCEDq=p->parentq==NULL?q->rtag==1||q->rchild==p?=后序線索二叉樹(shù)在后序線索二 叉樹(shù)中尋找當(dāng) 前結(jié)點(diǎn)的后繼后序序列p->rtag==1?后繼線索=右樹(shù)的存儲(chǔ)表示

雙親表示為了操作實(shí)現(xiàn)的方便,有時(shí)會(huì)規(guī)定結(jié)點(diǎn)的存放順序。例如,可以按樹(shù)的前序次序存放樹(shù)中的各個(gè)結(jié)點(diǎn),或按樹(shù)的層次次序安排所有結(jié)點(diǎn)。樹(shù)與樹(shù)的遍歷ABCDEFGdataparentABCDEFG-10001130123456樹(shù)的存儲(chǔ)表示樹(shù)與樹(shù)的遍歷ABCDEFGdataparentA子女鏈表表示無(wú)序樹(shù)情形鏈表中各結(jié)點(diǎn)順序任意,有序樹(shù)必須自左向右鏈接各個(gè)子女結(jié)點(diǎn)。ABCDEFG123∧45∧6∧∧∧∧∧ABCDEFG0123456子女鏈表表示無(wú)序樹(shù)情形鏈表中各結(jié)點(diǎn)順序任意,有序樹(shù)必須自左向子女指針表示一個(gè)合理的想法是在結(jié)點(diǎn)中存放指向每一個(gè)子女結(jié)點(diǎn)的指針。但由于各個(gè)結(jié)點(diǎn)的子女?dāng)?shù)不同,每個(gè)結(jié)點(diǎn)設(shè)置數(shù)目不等的指針,將很難管理。為此,設(shè)置等長(zhǎng)的結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)包含的指針個(gè)數(shù)相等,等于樹(shù)的度(degree)。這保證結(jié)點(diǎn)有足夠的指針指向它的所有子女結(jié)點(diǎn)。但可能產(chǎn)生很多空閑指針,造成存儲(chǔ)浪費(fèi)。子女指針表示一個(gè)合理的想法是在結(jié)點(diǎn)中存放指向每一個(gè)子女結(jié)點(diǎn)的等數(shù)量的鏈域ABCDEFG

datachild1child2child3childdABCDEFG空鏈域2n+1個(gè)等數(shù)量的鏈域ABCDEFGdatachild1child子女-兄弟表示也稱為樹(shù)的二叉樹(shù)表示。結(jié)點(diǎn)構(gòu)造為:firstChild指向該結(jié)點(diǎn)的第一個(gè)子女結(jié)點(diǎn)。無(wú)序樹(shù)時(shí),可任意指定一個(gè)結(jié)點(diǎn)為第一個(gè)子女。nextSibling指向該結(jié)點(diǎn)的下一個(gè)兄弟。任一結(jié)點(diǎn)在存儲(chǔ)時(shí)總是有順序的。若想找某結(jié)點(diǎn)的所有子女,可先找firstChild,再反復(fù)用nextSibling沿鏈掃描。

datafirstChildnextSibling子女-兄弟表示也稱為樹(shù)的二叉樹(shù)表示。結(jié)點(diǎn)構(gòu)造為:data樹(shù)的左子女-

右兄弟表示

datafchildnsiblingABCDEFGABCDGFE樹(shù)的左子女-datafchildnsiblingABC左子女-右兄弟表示的樹(shù)的結(jié)構(gòu)定義typedefintTElemType;typedefstructnode{

TElemTypedata;

structnode*fchild,*nsibling;}CSNode,*CSTree;注意,雖然此定義與二叉樹(shù)的類似,操作也類似,但語(yǔ)義是不同的。樹(shù)結(jié)構(gòu)是遞歸的,可用遞歸函數(shù)實(shí)現(xiàn)相應(yīng)操作。左子女-右兄弟表示的樹(shù)的結(jié)構(gòu)定義typedefintTE尋找雙親子女兄弟的操作TreeNode*FindParent(CSNode*T,CSNode*p){//在以T為根的樹(shù)中找結(jié)點(diǎn)p的雙親

if(T==NULL||p==NULL)returnNULL;CSNode*q=T->fchild,*s;

while(q!=NULL&&q!=p){

//循根的長(zhǎng)子的兄弟鏈,遞歸在子樹(shù)中搜索

if((s=FindParent(q,p))!=NULL)returns;

//在以q為根的子樹(shù)找到p的雙親,返回

q=q->nsibling;

}尋找雙親子女兄弟的操作TreeNode*FindPar

if(q!=NULL&&q==p)returnT;//找到雙親

elsereturnNULL;//未找到雙親}TreeNode*FindfirstChild(CSNode*p){//在樹(shù)中找結(jié)點(diǎn)p的第一個(gè)子女

if(p!=NULL)returnp->fchild;

else

returnNULL;};TreeNode*FindnextSibling(CSNode*p){//在樹(shù)中找結(jié)點(diǎn)p的兄弟if(q!=NULL&&q==p)

if(p!=NULL

)returnp->nsibling;

elsereturnNULL;}深度優(yōu)先遍歷先根次序遍歷后根次序遍歷廣度優(yōu)先遍歷樹(shù)的遍歷ABCDEFGABCEDGF二叉樹(shù)表示if(p!=NULL)return當(dāng)樹(shù)非空時(shí)訪問(wèn)根結(jié)點(diǎn)依次先根遍歷根的各棵子樹(shù)樹(shù)先根遍歷ABEFCDG 對(duì)應(yīng)二叉樹(shù)前序遍歷ABEFCDG樹(shù)的先根遍歷結(jié)果與其對(duì)應(yīng)二叉樹(shù) 表示的前序遍歷結(jié)果相同樹(shù)的先根遍歷可以借助對(duì)應(yīng)二叉樹(shù)的前序遍歷算法實(shí)現(xiàn)ABCEDGF樹(shù)的先根次序遍歷ABCDEFG當(dāng)樹(shù)非空時(shí)ABCEDGF樹(shù)的先根次序遍歷ABCDEFG樹(shù)的先根次序遍歷的遞歸算法voidPreOrder

(CSNode*t){ //以指針t為根,先根次序遍歷

if(t!=NULL){visit(t->data);

//訪問(wèn)根結(jié)點(diǎn)

CSNode*p

=t->fchild; //第一棵子樹(shù)

while(p!=NULL){

PreOrder(p); //遞歸先根遍歷子樹(shù)

p=p->nsibling;}}}樹(shù)的先根次序遍歷的遞歸算法voidPreOrder(C當(dāng)樹(shù)非空時(shí)依次后根遍歷根的各棵子樹(shù)訪問(wèn)根結(jié)點(diǎn)樹(shù)后根遍歷EFBCGDA 對(duì)應(yīng)二叉樹(shù)中序遍歷EFBCGDA樹(shù)的后根遍歷結(jié)果與其對(duì)應(yīng)二叉樹(shù) 表示的中序遍歷結(jié)果相同樹(shù)的后根遍歷可以借助對(duì)應(yīng)二叉樹(shù)的中序遍歷算法實(shí)現(xiàn)ABCEDGF樹(shù)的后根次序遍歷ABCDEFG當(dāng)樹(shù)非空時(shí)ABCEDGF樹(shù)的后根次序遍歷ABCDEFG樹(shù)的后根次序遍歷的遞歸算法voidPostOrder(CSNode*t){//以指針t為根,按后根次序遍歷樹(shù)

if(t!=NULL){CSNode

*p=t->fchild;while(p!=NULL){ PostOrder(p);

p=p->nsibling;

}visit(t->data); //最后訪問(wèn)根結(jié)點(diǎn)

}}樹(shù)的后根次序遍歷的遞歸算法voidPostOrder(按廣度優(yōu)先次序遍歷樹(shù)的結(jié)果

ABCDEFG廣度優(yōu)先遍歷算法 voidLevelOrder(CSTreeT){

//分層遍歷樹(shù),算法用到一個(gè)隊(duì)列

QueueQ;InitQueue(Q);

CSNode*p; if(T!=NULL){ //樹(shù)不空

EnQueue(Q,T); //根結(jié)點(diǎn)進(jìn)隊(duì)列廣度優(yōu)先(層次次序)遍歷ABCEDGFABCDEFG按廣度優(yōu)先次序遍歷樹(shù)的結(jié)果廣度優(yōu)先(層次次序)遍歷ABCED

while(!QueueEmpty(Q)){

DeQueue(Q,p);visit(p->data);

//隊(duì)列中取一個(gè)并訪問(wèn)之

p=p->fchild;

//待訪問(wèn)結(jié)點(diǎn)的子女結(jié)點(diǎn)進(jìn)隊(duì)列

while(p!=NULL){

EnQueue(Q,p);p=p->nsibling;

}}

}}while(!QueueE森林與二叉樹(shù)的轉(zhuǎn)換將一般樹(shù)化為二叉樹(shù)表示就是用樹(shù)的子女-兄弟表示來(lái)存儲(chǔ)樹(shù)的結(jié)構(gòu)。森林與二叉樹(shù)表示的轉(zhuǎn)換可以借助樹(shù)的二叉樹(shù)表示來(lái)實(shí)現(xiàn)。森林與二叉樹(shù)的轉(zhuǎn)換將一般樹(shù)化為二叉樹(shù)表示就是用樹(shù)的子女-兄弟T1T2T3AFHT1T2T3ABCDGIJEKFBCDEGHIKJABCEDHIKJFG3

棵樹(shù)的森林各棵樹(shù)的二叉樹(shù)表示森林的二叉樹(shù)表示T1T2T3AFHT1森林轉(zhuǎn)化成二叉樹(shù)的規(guī)則若F為空,即n=0,則對(duì)應(yīng)的二叉樹(shù)B為空樹(shù)。若F不空,則二叉樹(shù)B的根是F第一棵樹(shù)T1

的根;其左子樹(shù)為B(T11,T12,…,T1m),其中,T11,T12,…,T1m

是T1的根的子樹(shù);其右子樹(shù)為B(T2,T3,…,Tn),其中,T2,T3,…,Tn

是除T1

外其它樹(shù)構(gòu)成的森林。森林轉(zhuǎn)化成二叉樹(shù)的規(guī)則若F為空,即n=0,則對(duì)應(yīng)的二叉樹(shù)轉(zhuǎn)換為森林的規(guī)則如果B為空,則對(duì)應(yīng)的森林F也為空。如果B非空,則F中第一棵樹(shù)T1

的根為B的根;T1的根的子樹(shù)森林{T11,T12,…,T1m}是由B的根的左子樹(shù)LB轉(zhuǎn)換而來(lái);F中除了T1

之外其余的樹(shù)組成的森林{T2,T3,…,Tn}是由B的根的右子樹(shù)RB轉(zhuǎn)換而成的森林。二叉樹(shù)轉(zhuǎn)換為森林的規(guī)則如果B為空,則對(duì)應(yīng)的森林F也為例題設(shè)森林中有三棵樹(shù),第一、第二和第三棵樹(shù)中的結(jié)點(diǎn)個(gè)數(shù)分別為m1,m2和m3。那么在由該森林轉(zhuǎn)化成的二叉樹(shù)中根結(jié)點(diǎn)的右子樹(shù)上有()個(gè)結(jié)點(diǎn)。 A.m1+m2 B.m2+m3 C.m3+m1 D.m1+m2+m3【解答】在由森林轉(zhuǎn)化成的二叉樹(shù)中根結(jié)點(diǎn)的右子樹(shù)上的結(jié)點(diǎn)是除第一棵外其他樹(shù)上的結(jié)點(diǎn),應(yīng)有m2+m3個(gè),故選擇B。

例題設(shè)森林中有三棵樹(shù),第一、第二和第三棵樹(shù)中的結(jié)點(diǎn)個(gè)數(shù)分別為森林的遍歷森林的遍歷也分為深度優(yōu)先遍歷(包括先根次序遍歷和中根次序遍歷)和廣度優(yōu)先遍歷。深度優(yōu)先遍歷給定森林F,若F=?,則遍歷結(jié)束。否則若F={{T1={r1,T11,…,T1k},T2,...,Tm},則可以導(dǎo)出先根遍歷、中根遍歷兩種方法。其中,r1是第一棵樹(shù)的根結(jié)點(diǎn),{T11,…,T1k}是第一棵樹(shù)的子樹(shù)森林,{T2,...,Tm}是除去第一棵樹(shù)之后剩余的樹(shù)構(gòu)成的森林。森林的遍歷森林的遍歷也分為深度優(yōu)先遍歷(包括先根次序遍歷和中若森林F=?,返回;否則訪問(wèn)森林的根(也是第一棵樹(shù)的根)r1;先根遍歷森林第一棵樹(shù)的根的子樹(shù)森林{T11,…,T1k};先根遍歷森林中除第一棵樹(shù)外其他樹(shù)組成的森林{T2,...,Tm}。注意,②是一個(gè)循環(huán),對(duì)于每一個(gè)T1i,執(zhí)行樹(shù)的先根次序遍歷;③是一個(gè)遞歸過(guò)程,重新執(zhí)行T2

為第一棵樹(shù)的森林的先根次序遍歷。森林的先根次序遍歷若森林F=?,返回;否則森林的先根次序遍歷森林的先根次序遍歷的結(jié)果序列

ABCDEFGHIKJ這相當(dāng)于對(duì)應(yīng)二叉樹(shù)的前序遍歷結(jié)果。T1T2T3AFHBCDGIJEKBAEDHIKJFGC森林的先根次序遍歷的結(jié)果序列T1T2森林的中根次序遍歷若森林F=?,返回;否則中根遍歷森林

F

第一棵樹(shù)的根結(jié)點(diǎn)的子樹(shù)森林{T11,…,T1k};訪問(wèn)森林的根結(jié)點(diǎn)r1;中根遍歷森林中除第一棵樹(shù)外其他樹(shù)組成的森林{T2,...,Tm}。注意,與先根次序遍歷相比,訪問(wèn)根結(jié)點(diǎn)的時(shí)機(jī)不同。所以在③的情形,對(duì)以T2為第一棵樹(shù)的森林遍歷時(shí),重復(fù)執(zhí)行①②③的操作。森林的中根次序遍歷若森林F=?,返回;否則森林的中根次序遍歷的結(jié)果序列

BCEDAGFKIJH這相當(dāng)于對(duì)應(yīng)二叉樹(shù)中序遍歷的結(jié)果。T1T2T3AFHBCDGIJEKBAEDHIKJFGC森林的中根次序遍歷的結(jié)果序列T1T2廣度優(yōu)先遍歷(層次序遍歷)AFHBCDGIJEKABCEDHIKJFG若森林F

為空,返回; 否則依次遍歷各棵樹(shù)的 根結(jié)點(diǎn);依次遍歷各棵樹(shù)根 結(jié)點(diǎn)的所有子女;依次遍歷這些子女 結(jié)點(diǎn)的子女結(jié)點(diǎn);廣度優(yōu)先遍歷(層次序遍歷)AFHBCDGIJEKABCE樹(shù)的應(yīng)用二叉排序樹(shù)平衡二叉樹(shù)Huffman樹(shù)堆并查集樹(shù)的應(yīng)用二叉排序樹(shù)二叉排序樹(shù)(BinarySearchTree)定義

二叉排序樹(shù)或者是一棵空樹(shù),或者是具有下列性質(zhì)的二叉樹(shù):每個(gè)結(jié)點(diǎn)都有一個(gè)作為查找依據(jù)的關(guān)鍵字(key),所有結(jié)點(diǎn)的關(guān)鍵字互不相同。左子樹(shù)(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵字都小于根結(jié)點(diǎn)的關(guān)鍵字。右子樹(shù)(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵字都大于根結(jié)點(diǎn)的關(guān)鍵字。左子樹(shù)和右子樹(shù)也是二叉排序樹(shù)。二叉排序樹(shù)(BinarySearchTree)定義351545504025102030二叉排序樹(shù)例結(jié)點(diǎn)左子樹(shù)上所有關(guān)鍵 字小于結(jié)點(diǎn)關(guān)鍵字;結(jié)點(diǎn)右子樹(shù)上所有關(guān)鍵 字大于結(jié)點(diǎn)關(guān)鍵字;如果對(duì)一棵二叉排序樹(shù) 進(jìn)行中序遍歷,可以按 從小到大的順序?qū)⒏鹘Y(jié) 點(diǎn)關(guān)鍵字排列起來(lái)。注意,國(guó)外教材統(tǒng)稱為二叉搜索樹(shù)或二叉查找樹(shù)。351545504025102030二叉排序樹(shù)例結(jié)點(diǎn)左子樹(shù)上例題一棵二叉樹(shù)是二叉排序樹(shù)的()條件是樹(shù)中任一結(jié)點(diǎn)的關(guān)鍵字值都大于左子女的關(guān)鍵字值,小于右子女的關(guān)鍵字值。 A.充分但不必要B.必要但不充分C.充分且必要D.既不充分也不必要【解答】B。 通俗來(lái)講,必要條件是指符合定義則必具有后續(xù)講的特性。顯然一棵二叉樹(shù)是二叉排序樹(shù),則樹(shù)中任一結(jié)點(diǎn)的關(guān)鍵字值一定大于左子女的關(guān)鍵字值,小于右子女的關(guān)鍵字值。充分條件是指滿足例題一棵二叉樹(shù)是二叉排序樹(shù)的()條件是樹(shù)中任一結(jié)點(diǎn)的 后續(xù)講的特性則定義一定成立。就是說(shuō),如果一棵二叉樹(shù)任一結(jié)點(diǎn)的關(guān)鍵字值都大于左子女的關(guān)鍵字值,小于右子女的關(guān)鍵字值,則它一定是二叉排序樹(shù)。這就不一定了。

右圖描述的二叉樹(shù)滿足樹(shù)中 任一結(jié)點(diǎn)的關(guān)鍵字值一定大 于左子女的關(guān)鍵字值,小于 右子女的 關(guān)鍵字值,但它不 是二叉排序樹(shù)。2515353045102050 后續(xù)講的特性則定義一定成立。就是說(shuō),如果一棵二叉樹(shù)任一結(jié)點(diǎn)

二叉排序樹(shù)的結(jié)構(gòu)定義typedefcharBSTElemType; //樹(shù)結(jié)點(diǎn)數(shù)據(jù)類型typedefstructnode{ //二叉排序樹(shù)結(jié)點(diǎn)

BSTElemType

data;

structnode*lchild,*rchild;}BSTNode,*BSTree; //二叉排序樹(shù)定義從面向?qū)ο笥^點(diǎn)來(lái)看,二叉排序樹(shù)是二叉樹(shù)的特殊情形,它繼承了二叉樹(shù)的結(jié)構(gòu),增加了自己的特性,對(duì)數(shù)據(jù)的存放增加了約束。二叉排序樹(shù)的結(jié)構(gòu)定義typedefcharBST二叉排序樹(shù)上的查找查找45

查找成功

查找28查找失敗351545504025102030在二叉排序樹(shù)上進(jìn)行查找,是一個(gè)從根結(jié)點(diǎn)開(kāi)始,沿某一個(gè)分支逐層向下進(jìn)行比較判等的過(guò)程。它可以是一個(gè)遞歸的過(guò)程。二叉排序樹(shù)上的查找查找45查找28351545假設(shè)想要在二叉排序樹(shù)中查找關(guān)鍵字為x的元素,查找過(guò)程從根結(jié)點(diǎn)開(kāi)始。如果根指針為NULL,則查找不成功;否則用給定值x與根結(jié)點(diǎn)的關(guān)鍵字進(jìn)行比較:如果給定值等于根結(jié)點(diǎn)的關(guān)鍵字值,則查找成功。如果給定值小于根結(jié)點(diǎn)的關(guān)鍵字值,則繼續(xù)遞歸查找根結(jié)點(diǎn)的左子樹(shù);否則。遞歸查找根結(jié)點(diǎn)的右子樹(shù)。查找成功時(shí)檢測(cè)指針停留在樹(shù)中某個(gè)結(jié)點(diǎn)。假設(shè)想要在二叉排序樹(shù)中查找關(guān)鍵字為x的元素,查找過(guò)程從根結(jié)點(diǎn)可用判定樹(shù)描述查找過(guò)程。內(nèi)結(jié)點(diǎn)是樹(shù)中原有結(jié)點(diǎn),外結(jié)點(diǎn)是失敗結(jié)點(diǎn),代表樹(shù)中沒(méi)有的數(shù)據(jù)。查找不成功時(shí)檢測(cè)指針停留在某個(gè)失敗結(jié)點(diǎn)。3515455025102030查找22查找45可用判定樹(shù)描述查找過(guò)程。內(nèi)結(jié)點(diǎn)是樹(shù)中原有結(jié)點(diǎn),外結(jié)點(diǎn)是失敗結(jié)二叉排序樹(shù)的查找算法voidFind(BSTNode*t,BSTElemTypex,BSTNode*&p,BSTNode*&pr){//在二叉排序樹(shù)t中查找關(guān)鍵字等于x的結(jié)點(diǎn),成功//時(shí)p返回找到結(jié)點(diǎn)地址,pr是其雙親結(jié)點(diǎn).不成功//時(shí)p為空,pr返回最后走到的結(jié)點(diǎn)地址.

p=t;pr=NULL; //從根查找if(p!=NULL){

while(p!=NULL&&p->data!=x){pr=p;if(p->data<x)p=p->rchild;

elsep=p->lchild;二叉排序樹(shù)的查找算法voidFind(BSTNode

}}}查找的關(guān)鍵字比較次數(shù)最多不超過(guò)樹(shù)的高度。每次結(jié)點(diǎn)的插入,都要從根結(jié)點(diǎn)出發(fā)查找插入位置,然后把新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入。為了向二叉排序樹(shù)中插入一個(gè)新元素,必須先檢查這個(gè)元素是否在樹(shù)中已經(jīng)存在。二叉排序樹(shù)的插入}二叉排序樹(shù)的插入為此,在插入之前先使用查找算法在樹(shù)中檢查要插入元素有還是沒(méi)有。查找成功:樹(shù)中已有 這個(gè)元素,不再插入。查找不成功:樹(shù)中原 來(lái)沒(méi)有關(guān)鍵字等于給 定值的結(jié)點(diǎn),把新元 素加到查找操作停止 的地方。35154550402510203028插入新結(jié)點(diǎn)28為此,在插入之前先使用查找算法在樹(shù)中檢查要插入元素有還是沒(méi)有voidInsert

(BSTNode*&t,BSTElemTypex){//將新元素x插到以*t為根的二叉排序樹(shù)中

BstNode*pt,*prt,*q;

Find(t,x,pt,prt); //查找結(jié)點(diǎn)插入位置

if(pt==NULL){ //查找失敗時(shí)可插入

q=newBstNode;q->data=x; //創(chuàng)建結(jié)點(diǎn)

q->lchild=q->rchild=NULL;

if(prt==NULL)t=q;//空樹(shù)

else

if(x<prt->data)ptr->lchild=q;elseptr->rchild=q;}}voidInsert(BSTNode*&t,BS535378537865537865175378658717537865091787537865811787095378651517870981輸入數(shù)據(jù),建立二叉排序樹(shù)的過(guò)程輸入數(shù)據(jù){53,78,65,17,87,09,81,15}535378537865537865175378658717123111132223323同樣3個(gè)數(shù)據(jù){1,2,3},輸入順序不同,建立起來(lái)的二叉排序樹(shù)的形態(tài)也不同。這直接影響到二叉排序樹(shù)的查找性能。如果輸入序列選得不好,會(huì)建立起一棵單支樹(shù),使得二叉排序樹(shù)的高度達(dá)到最大。

{2,1,3}{1,2,3}{1,3,2}{2,3,1}{3,1,2}{3,2,1}123111132223323同樣3個(gè)數(shù)據(jù){1,2,二叉排序樹(shù)的刪除在二叉排序樹(shù)中刪除一個(gè)結(jié)點(diǎn)時(shí),必須將因刪除結(jié)點(diǎn)而斷開(kāi)的二叉鏈表重新鏈接起來(lái),同時(shí)確保二叉排序樹(shù)的性質(zhì)不會(huì)失去。為保證在刪除后樹(shù)的查找性能不至于降低,還需要防止重新鏈接后樹(shù)的高度增加。被刪結(jié)點(diǎn)的右子樹(shù)為空,可以拿它的左子女結(jié)點(diǎn)頂替它的位置,再釋放它。被刪結(jié)點(diǎn)的左子樹(shù)為空,可以拿它的右子女結(jié)點(diǎn)頂替它的位置,再釋放它。被刪結(jié)點(diǎn)的左、右子樹(shù)都不為空,可以在它二叉排序樹(shù)的刪除在二叉排序樹(shù)中刪除一個(gè)結(jié)點(diǎn)時(shí),必須將因刪除結(jié) 的右子樹(shù)中尋找中序下的第一個(gè)結(jié)點(diǎn)(所有比被刪關(guān)鍵字大的關(guān)鍵字中它的值最小),用它的值填補(bǔ)到被刪結(jié)點(diǎn)中,再來(lái)處理這個(gè)結(jié)點(diǎn)的刪除問(wèn)題。當(dāng)然,也可以到它的左子樹(shù)中尋找中序下的最后一個(gè)結(jié)點(diǎn)。右子樹(shù)空,用左子女頂替5378651787092345刪除4553786517870923 的右子樹(shù)中尋找中序下的第一個(gè)結(jié)點(diǎn)(所有比被刪關(guān)鍵字大的關(guān)鍵左子樹(shù)空,用右子女頂替在右子樹(shù)上找中序下第一個(gè)結(jié)點(diǎn)填補(bǔ)8853788817940923刪除7853948817092353788117940945刪除78236553

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論