




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6章章 樹(shù)和二叉樹(shù)樹(shù)和二叉樹(shù)n學(xué)習(xí)要點(diǎn)學(xué)習(xí)要點(diǎn): 熟練掌握二叉樹(shù)的結(jié)構(gòu)特性熟練掌握二叉樹(shù)的結(jié)構(gòu)特性熟悉二叉樹(shù)的各種存儲(chǔ)結(jié)構(gòu)特點(diǎn)及使用范圍熟悉二叉樹(shù)的各種存儲(chǔ)結(jié)構(gòu)特點(diǎn)及使用范圍熟練掌握各種遍歷策略的遞歸和非遞歸算法,靈熟練掌握各種遍歷策略的遞歸和非遞歸算法,靈活運(yùn)用遍歷算法實(shí)現(xiàn)二叉樹(shù)的其他操作活運(yùn)用遍歷算法實(shí)現(xiàn)二叉樹(shù)的其他操作熟練掌握二叉樹(shù)的線索化過(guò)程以及在中序線索化熟練掌握二叉樹(shù)的線索化過(guò)程以及在中序線索化樹(shù)上找給定結(jié)點(diǎn)的前驅(qū)和后繼的方法樹(shù)上找給定結(jié)點(diǎn)的前驅(qū)和后繼的方法掌握樹(shù)和森林與二叉樹(shù)的轉(zhuǎn)換方法掌握樹(shù)和森林與二叉樹(shù)的轉(zhuǎn)換方法學(xué)會(huì)編寫(xiě)實(shí)現(xiàn)樹(shù)的各種操作的算法學(xué)會(huì)編寫(xiě)實(shí)現(xiàn)樹(shù)的各種操作的算法了
2、解最優(yōu)樹(shù)的特性,掌握建立最優(yōu)樹(shù)和哈夫曼編了解最優(yōu)樹(shù)的特性,掌握建立最優(yōu)樹(shù)和哈夫曼編碼的方法碼的方法6.1 樹(shù)的定義和基本術(shù)語(yǔ)樹(shù)的定義和基本術(shù)語(yǔ)6.1.1 樹(shù)的定義樹(shù)的定義n樹(shù)型結(jié)構(gòu):樹(shù)型結(jié)構(gòu):非線性結(jié)構(gòu):至少存在一個(gè)數(shù)據(jù)元素有非線性結(jié)構(gòu):至少存在一個(gè)數(shù)據(jù)元素有兩個(gè)兩個(gè)或或兩兩個(gè)以上個(gè)以上的的直接前驅(qū)直接前驅(qū)(或或直接后繼直接后繼)元素的數(shù)據(jù)結(jié)構(gòu)。元素的數(shù)據(jù)結(jié)構(gòu)。用于描述層次結(jié)構(gòu)的關(guān)系:用于描述層次結(jié)構(gòu)的關(guān)系:n人類(lèi)的族譜、操作系統(tǒng)的文件系統(tǒng)、人類(lèi)的族譜、操作系統(tǒng)的文件系統(tǒng)、Internet中的中的DNS(域名系統(tǒng)域名系統(tǒng))等等分等級(jí)的分類(lèi)方案均可用層次結(jié)構(gòu)來(lái)表示,可由分等級(jí)的分類(lèi)方案均可用層次
3、結(jié)構(gòu)來(lái)表示,可由此導(dǎo)出樹(shù)型結(jié)構(gòu)。此導(dǎo)出樹(shù)型結(jié)構(gòu)。n樹(shù)的定義:樹(shù)的定義: 是是n(n0)個(gè)結(jié)點(diǎn)的有限集合個(gè)結(jié)點(diǎn)的有限集合T,對(duì)于任意一棵,對(duì)于任意一棵非空樹(shù),它滿(mǎn)足:非空樹(shù),它滿(mǎn)足:有且有且僅有一個(gè)僅有一個(gè)特定的稱(chēng)為特定的稱(chēng)為根根(root)的結(jié)點(diǎn);的結(jié)點(diǎn);當(dāng)當(dāng)n1時(shí),其余結(jié)點(diǎn)可分為時(shí),其余結(jié)點(diǎn)可分為m(m0)個(gè)個(gè)互不相交的互不相交的有限集有限集T1,T2,.,Tm,其中每個(gè)集合本身又是,其中每個(gè)集合本身又是一棵樹(shù),稱(chēng)為根的一棵樹(shù),稱(chēng)為根的子樹(shù)子樹(shù)。上述上述樹(shù)的定義是一個(gè)遞歸定義樹(shù)的定義是一個(gè)遞歸定義。例如:例如:ABCDEFGHIJMKLAn樹(shù)的類(lèi)型定義:樹(shù)的類(lèi)型定義:ADT Tree 數(shù)據(jù)對(duì)
4、象數(shù)據(jù)對(duì)象:D是具有相同特性的數(shù)據(jù)元素的集合。是具有相同特性的數(shù)據(jù)元素的集合。 數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系:若若D為空集,則稱(chēng)為空樹(shù);否則為空集,則稱(chēng)為空樹(shù);否則: (1) 在在D中存在唯一的稱(chēng)為根的數(shù)據(jù)元素中存在唯一的稱(chēng)為根的數(shù)據(jù)元素root, (2) 當(dāng)當(dāng)n1時(shí),其余結(jié)點(diǎn)可分為時(shí),其余結(jié)點(diǎn)可分為m (m0)個(gè)互不相個(gè)互不相交的有限集交的有限集T1, T2, , Tm, 其中每一棵子集本身又其中每一棵子集本身又是一棵符合本定義的樹(shù),稱(chēng)為根是一棵符合本定義的樹(shù),稱(chēng)為根root的子樹(shù)。的子樹(shù)。 基本操作基本操作:n查找類(lèi)查找類(lèi)n插入插入 n刪除刪除 ADT Tree查找類(lèi):查找類(lèi):nRoot(T) / 求
5、樹(shù)的根結(jié)點(diǎn)求樹(shù)的根結(jié)點(diǎn) nValue(T, cur_e) / 求當(dāng)前結(jié)點(diǎn)的元素值求當(dāng)前結(jié)點(diǎn)的元素值nParent(T, cur_e) / 求當(dāng)前結(jié)點(diǎn)的雙親結(jié)點(diǎn)求當(dāng)前結(jié)點(diǎn)的雙親結(jié)點(diǎn)nLeftChild(T, cur_e) / 求當(dāng)前結(jié)點(diǎn)的最左孩子求當(dāng)前結(jié)點(diǎn)的最左孩子nRightSibling(T, cur_e) / 求當(dāng)前結(jié)點(diǎn)的右兄弟求當(dāng)前結(jié)點(diǎn)的右兄弟nTreeEmpty(T) / 判定樹(shù)是否為空樹(shù)判定樹(shù)是否為空樹(shù)nTreeDepth(T) / 求樹(shù)的深度求樹(shù)的深度nTraverseTree( T, Visit() ) / 遍歷遍歷插入:插入:nInitTree(&T) / 初始化置空樹(shù)
6、初始化置空樹(shù)nCreateTree(&T, definition) / 按定義構(gòu)造按定義構(gòu)造nAssign(T, cur_e, value) / 給當(dāng)前結(jié)點(diǎn)賦值給當(dāng)前結(jié)點(diǎn)賦值nInsertChild(&T, &p, i, c) / 將以將以c為根的樹(shù)插入為結(jié)為根的樹(shù)插入為結(jié) /點(diǎn)點(diǎn)p的第的第i棵子樹(shù)棵子樹(shù)刪除:刪除:nClearTree(&T) / 將樹(shù)清空將樹(shù)清空nDestroyTree(&T) / 銷(xiāo)毀樹(shù)的結(jié)構(gòu)銷(xiāo)毀樹(shù)的結(jié)構(gòu)nDeleteChild(&T, &p, i) / 刪除結(jié)點(diǎn)刪除結(jié)點(diǎn)p的第的第i棵子棵子例如:例如:ABCDEFG
7、HIJMKL(A( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2樹(shù)根樹(shù)根T1T2T36.1.2 基本術(shù)語(yǔ)基本術(shù)語(yǔ)n結(jié)點(diǎn)結(jié)點(diǎn):包含一個(gè)數(shù)據(jù)元素包含一個(gè)數(shù)據(jù)元素及及若干指向其子樹(shù)的分若干指向其子樹(shù)的分支。支。n結(jié)點(diǎn)的度結(jié)點(diǎn)的度:結(jié)點(diǎn)擁有的:結(jié)點(diǎn)擁有的子樹(shù)數(shù)子樹(shù)數(shù)。如圖:如圖: A的度為的度為3, C的度為的度為1, E的度為的度為0。n葉子葉子(或終端或終端)結(jié)點(diǎn):度為零的結(jié)點(diǎn)。結(jié)點(diǎn):度為零的結(jié)點(diǎn)。n分支分支(或非終端或非終端)結(jié)點(diǎn):度大于零的結(jié)點(diǎn)。結(jié)點(diǎn):度大于零的結(jié)點(diǎn)。ABCDEFGHIJMKLn樹(shù)的度樹(shù)的度:樹(shù)中所有結(jié)點(diǎn)的:樹(shù)中所有結(jié)點(diǎn)的度的最大值度的最大值
8、。n結(jié)點(diǎn)的結(jié)點(diǎn)的子樹(shù)的根子樹(shù)的根稱(chēng)為該結(jié)點(diǎn)的稱(chēng)為該結(jié)點(diǎn)的孩子孩子(child) 。n相應(yīng)的,該結(jié)點(diǎn)相應(yīng)的,該結(jié)點(diǎn)稱(chēng)為孩子的稱(chēng)為孩子的雙親雙親(parent)。如圖所示,樹(shù)的度為如圖所示,樹(shù)的度為3;D為為A的子樹(shù)的子樹(shù)T3的根,則的根,則D是是A的孩子,而的孩子,而A則是則是D的雙親。的雙親。n同一個(gè)雙親同一個(gè)雙親的孩子之間互的孩子之間互 稱(chēng)稱(chēng)兄弟兄弟。如圖所示中,如圖所示中,H、I、J互稱(chēng)為兄弟。互稱(chēng)為兄弟。ABCDEFGHIJMKLE、G、H互稱(chēng)兄弟?互稱(chēng)兄弟?n雙親在同一層的結(jié)點(diǎn)互為雙親在同一層的結(jié)點(diǎn)互為堂兄弟堂兄弟。n結(jié)點(diǎn)的層次結(jié)點(diǎn)的層次:根結(jié)點(diǎn)的層次為:根結(jié)點(diǎn)的層次為1,第,第l層的
9、結(jié)點(diǎn)的層的結(jié)點(diǎn)的子樹(shù)的根結(jié)點(diǎn)的層次為子樹(shù)的根結(jié)點(diǎn)的層次為l+1。n樹(shù)的深度樹(shù)的深度:樹(shù)中:樹(shù)中葉子結(jié)點(diǎn)葉子結(jié)點(diǎn)所在的所在的最大層次最大層次。n森林森林:是:是m(m0)棵棵互不相交的互不相交的樹(shù)的集合。樹(shù)的集合。n任何一棵非空樹(shù)是一個(gè)任何一棵非空樹(shù)是一個(gè)二元組二元組Tree = (root,F(xiàn))其中:其中: root 被稱(chēng)為根結(jié)點(diǎn)被稱(chēng)為根結(jié)點(diǎn) F 被稱(chēng)為被稱(chēng)為子樹(shù)森林子樹(shù)森林ArootBCDEFGHIJMKLFn有序樹(shù)有序樹(shù):子樹(shù)之間存在確定的次序關(guān)系。:子樹(shù)之間存在確定的次序關(guān)系。(樹(shù)中結(jié)樹(shù)中結(jié)點(diǎn)的各子樹(shù)從左到右是有次序的,即不能互換點(diǎn)的各子樹(shù)從左到右是有次序的,即不能互換)。n無(wú)序樹(shù)無(wú)序樹(shù)
10、:子樹(shù)之間不存在確定的次序關(guān)系。:子樹(shù)之間不存在確定的次序關(guān)系。n樹(shù)型結(jié)構(gòu)和線性結(jié)構(gòu)的特點(diǎn):樹(shù)型結(jié)構(gòu)和線性結(jié)構(gòu)的特點(diǎn):線性結(jié)構(gòu)線性結(jié)構(gòu)樹(shù)型結(jié)構(gòu)樹(shù)型結(jié)構(gòu)第一個(gè)數(shù)據(jù)元素第一個(gè)數(shù)據(jù)元素 ( (無(wú)前驅(qū)無(wú)前驅(qū)) ) 根結(jié)點(diǎn)根結(jié)點(diǎn) ( (無(wú)前驅(qū)無(wú)前驅(qū)) )最后一個(gè)數(shù)據(jù)元素最后一個(gè)數(shù)據(jù)元素 (無(wú)后繼無(wú)后繼)多個(gè)葉子結(jié)點(diǎn)多個(gè)葉子結(jié)點(diǎn) ( (無(wú)后繼無(wú)后繼) )其它數(shù)據(jù)元素其它數(shù)據(jù)元素( (一個(gè)前驅(qū)、一個(gè)前驅(qū)、 一個(gè)后繼一個(gè)后繼) )其它數(shù)據(jù)元素其它數(shù)據(jù)元素( (一個(gè)前驅(qū)、一個(gè)前驅(qū)、 多個(gè)后繼多個(gè)后繼) )6.2.1 二叉樹(shù)的定義二叉樹(shù)的定義n定義定義:是:是n(n=0)個(gè)結(jié)點(diǎn)的有限集合,它或?yàn)閭€(gè)結(jié)點(diǎn)的有限集合,
11、它或?yàn)榭諛?shù)空樹(shù)(n=0),或由,或由一個(gè)根結(jié)點(diǎn)一個(gè)根結(jié)點(diǎn)和和至多兩棵至多兩棵稱(chēng)為根的稱(chēng)為根的左子左子樹(shù)樹(shù)和和右子樹(shù)右子樹(shù)的互不相交的的互不相交的二叉樹(shù)二叉樹(shù)組成。組成。注:二叉樹(shù)中不存在度大于注:二叉樹(shù)中不存在度大于2的結(jié)點(diǎn),并且二叉樹(shù)的結(jié)點(diǎn),并且二叉樹(shù)的子樹(shù)有左子樹(shù)和右子樹(shù)之分。的子樹(shù)有左子樹(shù)和右子樹(shù)之分。6.2 二叉樹(shù)二叉樹(shù)ABCDEFGHK根結(jié)點(diǎn)根結(jié)點(diǎn)左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)n二叉樹(shù)的五種基本形態(tài):二叉樹(shù)的五種基本形態(tài):N空樹(shù)空樹(shù)只含根結(jié)點(diǎn)只含根結(jié)點(diǎn)NNNLRR右子樹(shù)為空樹(shù)右子樹(shù)為空樹(shù)L左子樹(shù)為空樹(shù)左子樹(shù)為空樹(shù)左右子樹(shù)均左右子樹(shù)均不為空樹(shù)不為空樹(shù)n二叉樹(shù)的抽象數(shù)據(jù)類(lèi)型定義:二叉樹(shù)的抽象數(shù)
12、據(jù)類(lèi)型定義:ADT BinaryTree 數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象:D是具有相同特性的數(shù)據(jù)元素的集合。是具有相同特性的數(shù)據(jù)元素的集合。 數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系:若若D為空集,則稱(chēng)為空樹(shù);否則為空集,則稱(chēng)為空樹(shù);否則: (1) 在在D中存在唯一的稱(chēng)為根的數(shù)據(jù)元素中存在唯一的稱(chēng)為根的數(shù)據(jù)元素root, . 基本操作基本操作:n查找類(lèi)查找類(lèi)n插入插入 n刪除刪除ADT BinaryTree 詳細(xì)說(shuō)明見(jiàn)教材詳細(xì)說(shuō)明見(jiàn)教材P121P1236.2.2 二叉樹(shù)的性質(zhì)二叉樹(shù)的性質(zhì)n性質(zhì)性質(zhì)1 :在二叉樹(shù)的第在二叉樹(shù)的第 i 層上層上至多至多有有2i-1 個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)(i1)。證明證明:(歸納法歸納法)歸納基:歸納基:i =
13、 1 層時(shí),只有一個(gè)根結(jié)點(diǎn):層時(shí),只有一個(gè)根結(jié)點(diǎn): 2i-1 = 20 = 1,命題成立。,命題成立。歸納假設(shè):假設(shè)對(duì)所有的歸納假設(shè):假設(shè)對(duì)所有的 j,1 j i,命題成立。命題成立。即第即第j層上至多有層上至多有2j-1個(gè)結(jié)點(diǎn)。個(gè)結(jié)點(diǎn)。歸納證明:歸納證明:j=i時(shí),命題成立。時(shí),命題成立。 二叉樹(shù)上每個(gè)結(jié)點(diǎn)二叉樹(shù)上每個(gè)結(jié)點(diǎn)至多有兩棵子樹(shù)至多有兩棵子樹(shù),且由歸,且由歸納假設(shè)有:第納假設(shè)有:第i-1層上至多有層上至多有2i-2個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn) 第第 j=i 層的結(jié)點(diǎn)數(shù)至多層的結(jié)點(diǎn)數(shù)至多 = 2i-2 2 = 2i-1 。命題成命題成立立(證畢證畢)n性質(zhì)性質(zhì)2:深度為:深度為 k 的二叉樹(shù)上的二叉樹(shù)
14、上至多至多含含 2k-1 個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)(k1)。證明:證明:基于性質(zhì)基于性質(zhì)1,深度為,深度為 k 的二叉樹(shù)上的結(jié)點(diǎn)數(shù)至的二叉樹(shù)上的結(jié)點(diǎn)數(shù)至多為:多為:20+21+ +2k-1 = 2k-1 。n性質(zhì)性質(zhì)3:對(duì)任何一棵二叉樹(shù),若它含有對(duì)任何一棵二叉樹(shù),若它含有n0 個(gè)葉子結(jié)個(gè)葉子結(jié)點(diǎn)、點(diǎn)、n2 個(gè)度為個(gè)度為2的結(jié)點(diǎn),則必存在關(guān)系式:的結(jié)點(diǎn),則必存在關(guān)系式:n0 = n2+1。證明:證明:設(shè)二叉樹(shù)上結(jié)點(diǎn)總數(shù)設(shè)二叉樹(shù)上結(jié)點(diǎn)總數(shù) n = n0 + n1 + n2, 二叉樹(shù)上分支總數(shù)二叉樹(shù)上分支總數(shù) b = n1+2n2, 而而 b = n-1 = n0 + n1 + n2 1 由由, n0 = n2
15、 + 1 。除根結(jié)點(diǎn)外,其余結(jié)點(diǎn)都有一個(gè)分支除根結(jié)點(diǎn)外,其余結(jié)點(diǎn)都有一個(gè)分支進(jìn)入,設(shè)進(jìn)入,設(shè)b為分支總數(shù),則為分支總數(shù),則n=b+1。n兩類(lèi)兩類(lèi)特殊特殊的二叉樹(shù):的二叉樹(shù):滿(mǎn)二叉樹(shù)滿(mǎn)二叉樹(shù):指的是深度為:指的是深度為k且含有且含有2k-1個(gè)結(jié)點(diǎn)的二叉?zhèn)€結(jié)點(diǎn)的二叉樹(shù)。樹(shù)。完全二叉樹(shù)完全二叉樹(shù):樹(shù)中所含的:樹(shù)中所含的 n 個(gè)結(jié)點(diǎn)和滿(mǎn)二叉樹(shù)中個(gè)結(jié)點(diǎn)和滿(mǎn)二叉樹(shù)中編編號(hào)為號(hào)為 1 至至 n 的結(jié)點(diǎn)的結(jié)點(diǎn)一一對(duì)應(yīng)。一一對(duì)應(yīng)。123456789101112131415abcdefghij特點(diǎn)特點(diǎn):是:是每一層每一層上的結(jié)點(diǎn)數(shù)都是上的結(jié)點(diǎn)數(shù)都是最大結(jié)點(diǎn)數(shù)最大結(jié)點(diǎn)數(shù)。特點(diǎn)特點(diǎn):葉子結(jié)點(diǎn)葉子結(jié)點(diǎn)只可能只可能在在層
16、次最大層次最大的兩層的兩層出現(xiàn);出現(xiàn);對(duì)任一結(jié)點(diǎn),若其對(duì)任一結(jié)點(diǎn),若其右右分支下的子孫的分支下的子孫的最大層次為最大層次為l,則其,則其左左分支下的子孫的分支下的子孫的最大層次為最大層次為l或或l+1。完全二叉樹(shù)的性質(zhì):完全二叉樹(shù)的性質(zhì):n性質(zhì)性質(zhì)4:具有具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度深度為為 log2n +1。證明:證明:設(shè)完全二叉樹(shù)的深度為設(shè)完全二叉樹(shù)的深度為k,則根據(jù)性質(zhì)則根據(jù)性質(zhì)2(深度深度為為k的二叉樹(shù)至多有的二叉樹(shù)至多有2k-1個(gè)結(jié)點(diǎn)個(gè)結(jié)點(diǎn)) 得得 2k-1-1 n 2k 1,或:,或: 2k-1 n 2k 即即 k-1 log2 n n,則該結(jié)點(diǎn)無(wú)左孩子,否則
17、,編號(hào)為,則該結(jié)點(diǎn)無(wú)左孩子,否則,編號(hào)為 2i 的結(jié)點(diǎn)為其的結(jié)點(diǎn)為其左孩子左孩子結(jié)點(diǎn);結(jié)點(diǎn);(3)若若 2i+1n,則該結(jié)點(diǎn)無(wú)右孩子結(jié)點(diǎn),否則,編號(hào),則該結(jié)點(diǎn)無(wú)右孩子結(jié)點(diǎn),否則,編號(hào)為為2i+1 的結(jié)點(diǎn)為其的結(jié)點(diǎn)為其右孩子右孩子結(jié)點(diǎn)。結(jié)點(diǎn)。 i/2 i 2i 2i+1 i+1 2i+2 2i+3 i+1 2i+2 2i+3 i2i2i+1 .n性質(zhì)練習(xí):性質(zhì)練習(xí):1. 一棵二叉樹(shù)在其第五層中有一棵二叉樹(shù)在其第五層中有17個(gè)結(jié)點(diǎn),可不可能?個(gè)結(jié)點(diǎn),可不可能?2. 二叉樹(shù)的根結(jié)點(diǎn)屬于第二叉樹(shù)的根結(jié)點(diǎn)屬于第0層還是屬于第層還是屬于第1層?層?3. 已知一棵二叉樹(shù)有已知一棵二叉樹(shù)有20個(gè)結(jié)點(diǎn),其中個(gè)結(jié)
18、點(diǎn),其中6個(gè)結(jié)點(diǎn)為葉子,則該個(gè)結(jié)點(diǎn)為葉子,則該樹(shù)中度為樹(shù)中度為2的結(jié)點(diǎn)數(shù)為的結(jié)點(diǎn)數(shù)為 ?度為?度為0的結(jié)點(diǎn)為的結(jié)點(diǎn)為 ?4. 已知一棵完全二叉樹(shù)中編號(hào)為已知一棵完全二叉樹(shù)中編號(hào)為101的結(jié)點(diǎn)有的結(jié)點(diǎn)有LC和和RC結(jié)點(diǎn),結(jié)點(diǎn),則其則其LC結(jié)點(diǎn)編號(hào)為結(jié)點(diǎn)編號(hào)為 ,RC結(jié)點(diǎn)編號(hào)為結(jié)點(diǎn)編號(hào)為 ?5. 一棵深度為一棵深度為h的完全的完全k叉樹(shù),如果按層次自頂向下、同一層叉樹(shù),如果按層次自頂向下、同一層自左向右、順序從自左向右、順序從1開(kāi)始對(duì)全部結(jié)點(diǎn)進(jìn)行編號(hào),試問(wèn):該開(kāi)始對(duì)全部結(jié)點(diǎn)進(jìn)行編號(hào),試問(wèn):該樹(shù)上最多有多少個(gè)結(jié)點(diǎn)?最少有多少個(gè)結(jié)點(diǎn)?樹(shù)上最多有多少個(gè)結(jié)點(diǎn)?最少有多少個(gè)結(jié)點(diǎn)?第第i層上至多有層上至多有2
19、i-1個(gè)結(jié)點(diǎn),則個(gè)結(jié)點(diǎn),則25-1=16。所以,不可能。所以,不可能。第第1層層56由性質(zhì)由性質(zhì)3:n0=n2+1,則,則n2=n0-1=6-1=5。202203由性質(zhì)由性質(zhì)5,可知左孩子為,可知左孩子為2i,右孩子為,右孩子為2i+1由性質(zhì)由性質(zhì)1和定義,可知除第和定義,可知除第h層外,其余各層都是滿(mǎn)的,所以:層外,其余各層都是滿(mǎn)的,所以:1+k+k2+.+kh-2=(kh-1-1)/(k-1),則最多有:,則最多有: (kh-1-1)/(k-1)+kh-1=(kh-1)/(k-1);最少有:最少有:(kh-1-1)/(k-1)+1課后作業(yè)課后作業(yè)P38:6.5P39:6.6(要求:寫(xiě)出推導(dǎo)
20、過(guò)程要求:寫(xiě)出推導(dǎo)過(guò)程)6.2.3 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)n順序存儲(chǔ)結(jié)構(gòu):順序存儲(chǔ)結(jié)構(gòu):#define MAX_TREE_SIZE 100 / 二叉樹(shù)的最大結(jié)點(diǎn)數(shù)二叉樹(shù)的最大結(jié)點(diǎn)數(shù)typedef TElemType SqBiTreeMAX_TREE_SIZE; / 0號(hào)單元存儲(chǔ)根結(jié)點(diǎn)號(hào)單元存儲(chǔ)根結(jié)點(diǎn)SqBiTree bt;特點(diǎn):特點(diǎn):n一組地址連續(xù)的存儲(chǔ)單元存儲(chǔ)各結(jié)點(diǎn)一組地址連續(xù)的存儲(chǔ)單元存儲(chǔ)各結(jié)點(diǎn)(定義一個(gè)一維定義一個(gè)一維數(shù)組數(shù)組);n自根而下、自左而右存儲(chǔ)結(jié)點(diǎn);自根而下、自左而右存儲(chǔ)結(jié)點(diǎn);n按按完全二叉樹(shù)完全二叉樹(shù)上的上的結(jié)點(diǎn)位置結(jié)點(diǎn)位置進(jìn)行編號(hào)和存儲(chǔ)。進(jìn)行編號(hào)和存儲(chǔ)。例如:例如
21、:ABCDEF A B D C E F 0 1 2 3 4 5 6 7 8 9 10 11 12 131401326在最壞的情況下,一個(gè)深度為在最壞的情況下,一個(gè)深度為k且只有且只有k個(gè)結(jié)點(diǎn)的單支樹(shù)個(gè)結(jié)點(diǎn)的單支樹(shù)(樹(shù)中不存在度為樹(shù)中不存在度為2的的結(jié)點(diǎn)結(jié)點(diǎn))卻需要卻需要2k-1的一維數(shù)組。的一維數(shù)組。缺點(diǎn):空間利用率太低!缺點(diǎn):空間利用率太低!n鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):二叉鏈表:二叉鏈表:ADEBCF rootlchild data rchild結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu): :C語(yǔ)言的類(lèi)型描述:語(yǔ)言的類(lèi)型描述:typedef struct BiTNode / 結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu) TElemType d
22、ata; struct BiTNode *lchild, *rchild; / 左右孩子指針左右孩子指針 BiTNode, *BiTree;三叉鏈表:三叉鏈表:ADEBCF root parent lchild data rchild結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu): :typedef struct TriTNode / 結(jié)點(diǎn)結(jié)構(gòu)結(jié)點(diǎn)結(jié)構(gòu) TElemType data; struct TriTNode *lchild, *rchild; / 左右孩子指針左右孩子指針 struct TriTNode *parent; /雙親指針雙親指針 TriTNode, *TriTree;6.3.1 遍歷二叉樹(shù)遍歷二叉樹(shù)n問(wèn)
23、題的提出:?jiǎn)栴}的提出: 順著某一條搜索路徑順著某一條搜索路徑巡訪巡訪二叉樹(shù)中的結(jié)點(diǎn),使二叉樹(shù)中的結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)得每個(gè)結(jié)點(diǎn)均被訪問(wèn)一次均被訪問(wèn)一次,而且,而且僅被訪問(wèn)一次僅被訪問(wèn)一次。注意:此處注意:此處“訪問(wèn)訪問(wèn)”的含義可以很廣,如:輸出的含義可以很廣,如:輸出結(jié)點(diǎn)的信息等。結(jié)點(diǎn)的信息等。 “遍歷遍歷”是任何類(lèi)型均有的操作,對(duì)線性結(jié)構(gòu)而言,是任何類(lèi)型均有的操作,對(duì)線性結(jié)構(gòu)而言,只有一條搜索路徑只有一條搜索路徑( (因?yàn)槊總€(gè)結(jié)點(diǎn)均只有一個(gè)后繼因?yàn)槊總€(gè)結(jié)點(diǎn)均只有一個(gè)后繼) ),故不需要另加討論。而二叉樹(shù)是非線性結(jié)構(gòu),每個(gè)結(jié)故不需要另加討論。而二叉樹(shù)是非線性結(jié)構(gòu),每個(gè)結(jié)點(diǎn)有兩個(gè)后繼,則存在如何遍
24、歷即按什么樣的搜索路點(diǎn)有兩個(gè)后繼,則存在如何遍歷即按什么樣的搜索路徑遍歷的問(wèn)題。徑遍歷的問(wèn)題。6.3 遍歷二叉樹(shù)和線索二叉樹(shù)遍歷二叉樹(shù)和線索二叉樹(shù)n三條搜索路徑:三條搜索路徑:先上后下先上后下的按層次遍歷;的按層次遍歷;先左先左(子樹(shù)子樹(shù))后右后右(子樹(shù)子樹(shù))的遍歷;的遍歷;先右先右(子樹(shù)子樹(shù))后左后左(子樹(shù)子樹(shù))的遍歷。的遍歷。n先左后右的遍歷算法:先左后右的遍歷算法:先先(根根)序的遍歷算法序的遍歷算法中中(根根)序的遍歷算法序的遍歷算法后后(根根)序的遍歷算法序的遍歷算法根根左左子樹(shù)子樹(shù)右右子樹(shù)子樹(shù)先先(根根)序的遍歷算法:序的遍歷算法:若二叉樹(shù)為空樹(shù),則空操作;否則,若二叉樹(shù)為空樹(shù),則
25、空操作;否則, 訪問(wèn)根結(jié)點(diǎn);訪問(wèn)根結(jié)點(diǎn); 先序遍歷左子樹(shù);先序遍歷左子樹(shù); 先序遍歷右子樹(shù)。先序遍歷右子樹(shù)。中中(根根)序的遍歷算法:序的遍歷算法:若二叉樹(shù)為空樹(shù),則空操作;否則,若二叉樹(shù)為空樹(shù),則空操作;否則, 中序遍歷左子樹(shù);中序遍歷左子樹(shù); 訪問(wèn)根結(jié)點(diǎn);訪問(wèn)根結(jié)點(diǎn); 中序遍歷右子樹(shù)。中序遍歷右子樹(shù)。后后(根根)序的遍歷算法:序的遍歷算法:若二叉樹(shù)為空樹(shù),則空操作;否則,若二叉樹(shù)為空樹(shù),則空操作;否則, 后序遍歷左子樹(shù);后序遍歷左子樹(shù); 后序遍歷右子樹(shù);后序遍歷右子樹(shù); 訪問(wèn)根結(jié)點(diǎn)。訪問(wèn)根結(jié)點(diǎn)。例如:例如:ABCDEFGHK先序序列:先序序列:中序序列:中序序列:后序序列:后序序列:A B
26、 C D E F G H KB D C A E H G K FD C B H K G F E AFn算法的遞歸實(shí)現(xiàn):算法的遞歸實(shí)現(xiàn):void Preorder (BiTree T, void ( *visit)(TElemType e) / 先序遍歷二叉樹(shù)先序遍歷二叉樹(shù) if (T) visit(T-data); / 訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn) Preorder(T-lchild, visit); / 遍歷左子樹(shù)遍歷左子樹(shù) Preorder(T-rchild, visit); / 遍歷右子樹(shù)遍歷右子樹(shù) 寫(xiě)法比較:寫(xiě)法比較:nint ( *visit)(TElemType &e)的含義:的含義:
27、visit是指針,指向是指針,指向int類(lèi)型的函數(shù)類(lèi)型的函數(shù)nint *visit(TElemType &e)的含義:的含義: visit是函數(shù),其返回值為指向是函數(shù),其返回值為指向int的指針的指針最簡(jiǎn)單的最簡(jiǎn)單的visit函數(shù)是:函數(shù)是:Void PrintElement(TElemType e) Printf(e);例:對(duì)應(yīng)表達(dá)式例:對(duì)應(yīng)表達(dá)式 a+b*(c-d)-e/fabcde-+/f-中序遍歷中序遍歷此二叉樹(shù),可得到此二叉樹(shù)此二叉樹(shù),可得到此二叉樹(shù)的中序序列為的中序序列為a+b*c-d-e/f (表達(dá)式的表達(dá)式的中綴中綴表示表示)若若先序遍歷先序遍歷二叉樹(shù),按訪問(wèn)結(jié)點(diǎn)的先后
28、二叉樹(shù),按訪問(wèn)結(jié)點(diǎn)的先后次序?qū)⒔Y(jié)點(diǎn)排列起來(lái),可得到二叉樹(shù)的次序?qū)⒔Y(jié)點(diǎn)排列起來(lái),可得到二叉樹(shù)的先序序列為先序序列為 -+a*b-cd/ef (表達(dá)式的表達(dá)式的前綴前綴表示表示波蘭式波蘭式)后序遍歷后序遍歷此二叉樹(shù),可得到此二叉樹(shù)的后序序此二叉樹(shù),可得到此二叉樹(shù)的后序序列為列為abcd-*+ef/- (表達(dá)式的表達(dá)式的后綴后綴表示表示逆波蘭式逆波蘭式)n遍歷的遞歸執(zhí)行過(guò)程:遍歷的遞歸執(zhí)行過(guò)程:例如:表達(dá)式例如:表達(dá)式a*b-c的二叉樹(shù)如下的二叉樹(shù)如下a-b*c-*abc-*abc-cb*aab*c-12先序序列:先序序列:-*abc中序序列:中序序列:a*b-c后序序列:后序序列:ab*c-n中序
29、遍歷的非遞歸算法:中序遍歷的非遞歸算法:BiTNode *GoFarLeft(BiTree T, Stack *S) if (!T ) return NULL; while (T-lchild ) Push(S, T); T = T-lchild; return T;-*abcab*c-12TTlchildTlchildlchildTlchildlchildlchildTtoptoptoptoptopTlchildlchildrchildTlchildrchildTlchildrchildlchildTlchildrchildrchildvoid Inorder_I(BiTree T, voi
30、d (*visit) (TelemType& e) Stack *S; t = GoFarLeft(T, S); / 找到最左下的結(jié)點(diǎn)找到最左下的結(jié)點(diǎn) while(t) visit(t-data); if (t-rchild) t = GoFarLeft(t-rchild, S); else if ( !StackEmpty(S ) / 棧不空時(shí)退棧棧不空時(shí)退棧 t = Pop(S); else t = NULL; / ??毡砻鞅闅v結(jié)束??毡砻鞅闅v結(jié)束 / while/ Inorder_I n遍歷算法的應(yīng)用舉例:遍歷算法的應(yīng)用舉例:統(tǒng)計(jì)二叉樹(shù)中葉子結(jié)點(diǎn)的個(gè)數(shù)統(tǒng)計(jì)二叉樹(shù)中葉子結(jié)點(diǎn)的個(gè)數(shù)n
31、算法基本思想算法基本思想: 先序先序(或中序或后序或中序或后序)遍歷二叉樹(shù),在遍歷過(guò)程中查找葉遍歷二叉樹(shù),在遍歷過(guò)程中查找葉子結(jié)點(diǎn),并計(jì)數(shù)。由此,需在遍歷算法中:子結(jié)點(diǎn),并計(jì)數(shù)。由此,需在遍歷算法中:增添增添一個(gè)一個(gè)“計(jì)數(shù)計(jì)數(shù)”的參數(shù)的參數(shù);將算法中將算法中“訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn)”的的操作改為操作改為:若是:若是葉子,則計(jì)數(shù)葉子,則計(jì)數(shù)器增器增1。void CountLeaf (BiTree T, int& count) if ( T ) if (!T-lchild)& (!T-rchild) count+; / 對(duì)葉子結(jié)點(diǎn)計(jì)數(shù)對(duì)葉子結(jié)點(diǎn)計(jì)數(shù) CountLeaf( T-lchild
32、, count); /統(tǒng)計(jì)左子樹(shù)葉子結(jié)點(diǎn)統(tǒng)計(jì)左子樹(shù)葉子結(jié)點(diǎn) CountLeaf( T-rchild, count); /統(tǒng)計(jì)右子樹(shù)葉子結(jié)點(diǎn)統(tǒng)計(jì)右子樹(shù)葉子結(jié)點(diǎn) / if / CountLeaf求二叉樹(shù)的深度求二叉樹(shù)的深度(后序遍歷后序遍歷)分析分析:二叉樹(shù)的深度:二叉樹(shù)的深度h和它的左、右子樹(shù)深度之間的和它的左、右子樹(shù)深度之間的關(guān)系?關(guān)系?n算法基本思想算法基本思想:先先分別分別求得左、右子樹(shù)求得左、右子樹(shù)的深度;的深度;算法中算法中“訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn)”的的操作為操作為:求得左、右子樹(shù)深度的:求得左、右子樹(shù)深度的最大值,然后加最大值,然后加 1 。int Depth (BiTree T ) /
33、返回二叉樹(shù)的深度返回二叉樹(shù)的深度 if ( !T ) depthval = 0; else depthLeft = Depth( T-lchild ); /求左子樹(shù)深度求左子樹(shù)深度 depthRight= Depth( T-rchild ); /求右子樹(shù)深度求右子樹(shù)深度 depthval = 1 + (depthLeft depthRight ? depthLeft : depthRight); return depthval;h=maxhl, hr+1復(fù)制二叉樹(shù)復(fù)制二叉樹(shù)(后序遍歷后序遍歷):n其基本操作為:生成一個(gè)結(jié)點(diǎn)其基本操作為:生成一個(gè)結(jié)點(diǎn)根元素根元素T左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)根元素根
34、元素NEWT左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)n算法思想算法思想:復(fù)制左、右子樹(shù);復(fù)制左、右子樹(shù);“訪問(wèn)結(jié)點(diǎn)訪問(wèn)結(jié)點(diǎn)”的操作為:生成一個(gè)結(jié)點(diǎn)。的操作為:生成一個(gè)結(jié)點(diǎn)。n生成一個(gè)二叉樹(shù)的結(jié)點(diǎn)生成一個(gè)二叉樹(shù)的結(jié)點(diǎn)(其數(shù)據(jù)域?yàn)槠鋽?shù)據(jù)域?yàn)閕tem,左指針域?yàn)樽笾羔樣驗(yàn)閘ptr,右指針域?yàn)橛抑羔樣驗(yàn)閞ptr)BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr ) if (!(T = (BiTNode*)malloc(sizeof(BiTNode) exit(1); T- data = item; T- lch
35、ild = lptr; T- rchild = rptr; return T;n復(fù)制:復(fù)制:BiTNode *CopyTree(BiTNode *T) if (!T ) return NULL; if (T-lchild ) newlptr = CopyTree(T-lchild); /復(fù)制左子樹(shù)復(fù)制左子樹(shù) else newlptr = NULL; if (T-rchild ) newrptr = CopyTree(T-rchild); /復(fù)制右子樹(shù)復(fù)制右子樹(shù) else newrptr = NULL; newT = GetTreeNode(T-data, newlptr, newrptr);
36、return newT; / CopyTree例如:下列二叉樹(shù)的復(fù)制過(guò)程如下例如:下列二叉樹(shù)的復(fù)制過(guò)程如下ABCDEFGHK D C B H K G F E AnewTn建立二叉樹(shù)的存儲(chǔ)結(jié)構(gòu):建立二叉樹(shù)的存儲(chǔ)結(jié)構(gòu):基本要點(diǎn):基本要點(diǎn): n以以“遍歷遍歷”為基本出發(fā)點(diǎn)為基本出發(fā)點(diǎn)n不同的遍歷方法相應(yīng)地有不同的建立算法代碼不同的遍歷方法相應(yīng)地有不同的建立算法代碼以以字符串字符串的形式的形式“根左子樹(shù)右子樹(shù)根左子樹(shù)右子樹(shù)”定義一定義一棵二叉樹(shù)棵二叉樹(shù)例如:例如:ABCD以空白字符以空白字符“ ”表示表示A(B( ,C( , ),D( , )空樹(shù)空樹(shù)只含一個(gè)根結(jié)點(diǎn)的二叉樹(shù)只含一個(gè)根結(jié)點(diǎn)的二叉樹(shù)A以字符
37、串以字符串“A ”表示表示以下列字符串表示以下列字符串表示Status CreateBiTree(BiTree &T) /先序次序輸入結(jié)點(diǎn)先序次序輸入結(jié)點(diǎn) scanf(&ch); if (ch= ) T = NULL; /第一個(gè)字符為空白字符第一個(gè)字符為空白字符 else if (!(T = (BiTNode *)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; / 生成根結(jié)點(diǎn)生成根結(jié)點(diǎn) CreateBiTree(T-lchild); / 構(gòu)造左子樹(shù)構(gòu)造左子樹(shù) CreateBiTree(T-rchild); / 構(gòu)造右子樹(shù)構(gòu)
38、造右子樹(shù) return OK; / CreateBiTree上述算法的執(zhí)行過(guò)程:上述算法的執(zhí)行過(guò)程:A B C D A BCDATBCD由二叉樹(shù)的由二叉樹(shù)的先序和中序先序和中序序列建樹(shù):序列建樹(shù):n僅知僅知二叉樹(shù)的二叉樹(shù)的先序序列先序序列“abcdefg” ,不能不能唯一確定唯一確定一棵二叉樹(shù)。一棵二叉樹(shù)。n如果同時(shí)已知二叉樹(shù)的中序序列如果同時(shí)已知二叉樹(shù)的中序序列“cbdaegf”,則會(huì),則會(huì)如何?如何?二叉樹(shù)的二叉樹(shù)的先序先序序列序列二叉樹(shù)的二叉樹(shù)的中序中序序列序列左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)根根左子樹(shù)左子樹(shù)右子樹(shù)右子樹(shù)根根abcdefgcbdaegf例如:例如:a b c d e f gc b
39、 d a e g faab bccddeeffggabcdefg先序序列先序序列中序序列中序序列課后作業(yè)課后作業(yè)1. P41:6.286.3.2 線索二叉樹(shù)線索二叉樹(shù)n何謂線索二叉樹(shù)?何謂線索二叉樹(shù)?遍歷二叉樹(shù)的結(jié)果是,求得結(jié)點(diǎn)的一個(gè)線性序列。遍歷二叉樹(shù)的結(jié)果是,求得結(jié)點(diǎn)的一個(gè)線性序列。ABCDEFGHK例如例如:先序序列先序序列: A B C D E F G H K中序序列中序序列: B D C A H G K F E后序序列后序序列: D C B H K G F E A“前驅(qū)前驅(qū)”和和“后繼后繼”的信息是在遍歷的過(guò)程中的信息是在遍歷的過(guò)程中動(dòng)態(tài)動(dòng)態(tài)得到的,不同的遍歷算法,確定的得到的,不同
40、的遍歷算法,確定的“前驅(qū)前驅(qū)”和和“后繼后繼”是不同的!是不同的!保保 存存?指向該指向該線性序列中線性序列中的的“前驅(qū)前驅(qū)”和和 “后繼后繼” 的指針,的指針,稱(chēng)作稱(chēng)作“線索線索”。A B C D E F G H K D C B E 包含包含“線索線索”的存儲(chǔ)結(jié)構(gòu),的存儲(chǔ)結(jié)構(gòu),稱(chēng)作稱(chēng)作“線索鏈表線索鏈表”。與其相應(yīng)的二叉樹(shù),稱(chēng)作與其相應(yīng)的二叉樹(shù),稱(chēng)作“線索二叉樹(shù)線索二叉樹(shù)”。n對(duì)線索鏈表中結(jié)點(diǎn)的約定:對(duì)線索鏈表中結(jié)點(diǎn)的約定: 在二叉鏈表的結(jié)點(diǎn)中在二叉鏈表的結(jié)點(diǎn)中增加兩個(gè)標(biāo)志域增加兩個(gè)標(biāo)志域,并作如,并作如下規(guī)定:下規(guī)定:若該結(jié)點(diǎn)的若該結(jié)點(diǎn)的左子樹(shù)不空左子樹(shù)不空, 則則lchild域的指針指向
41、其左子樹(shù),且左標(biāo)志域的值域的指針指向其左子樹(shù),且左標(biāo)志域的值為為“指針指針 Link”;否則,;否則,lchild域的指針指向其域的指針指向其“前驅(qū)前驅(qū)”,且左標(biāo)志的值為,且左標(biāo)志的值為“線索線索 Thread” 。若該結(jié)點(diǎn)的若該結(jié)點(diǎn)的右子樹(shù)不空右子樹(shù)不空, 則則rchild域的指針指向其右子樹(shù),且右標(biāo)志域的值域的指針指向其右子樹(shù),且右標(biāo)志域的值為為 “指針指針 Link”;否則,;否則,rchild域的指針指向其域的指針指向其“后繼后繼”,且右標(biāo)志的值為,且右標(biāo)志的值為“線索線索 Thread”。 n線索鏈表的存儲(chǔ)描述:線索鏈表的存儲(chǔ)描述:typedef enum Link, Thread
42、PointerThr; / Link=0:指針,指針,Thread=1:線索線索typedef struct BiThrNod TElemType data; struct BiThrNode *lchild, *rchild; / 左、右指針左、右指針 PointerThr LTag, RTag; / 左、右標(biāo)志左、右標(biāo)志 BiThrNode, *BiThrTree;lchild LTag data RTag rchildp對(duì)二叉樹(shù)對(duì)二叉樹(shù)以某種次序遍歷以某種次序遍歷使其變?yōu)榫€索二叉樹(shù)的過(guò)程使其變?yōu)榫€索二叉樹(shù)的過(guò)程稱(chēng)為稱(chēng)為線索化線索化。思考:一棵二叉樹(shù)的線索二叉樹(shù)是唯一的嗎?思考:一棵二叉樹(shù)
43、的線索二叉樹(shù)是唯一的嗎?二叉線索鏈表二叉線索鏈表n二叉線索鏈表的遍歷:二叉線索鏈表的遍歷: 添加了遍歷中得到的添加了遍歷中得到的“前驅(qū)前驅(qū)”和和“后繼后繼”的信的信息,從而簡(jiǎn)化了遍歷的算法。息,從而簡(jiǎn)化了遍歷的算法。for ( p = firstNode(T); p; p = Succ(p) ) Visit (p);例如:對(duì)中序線索化鏈表的遍歷算法。例如:對(duì)中序線索化鏈表的遍歷算法。中序遍歷的第一個(gè)結(jié)點(diǎn)中序遍歷的第一個(gè)結(jié)點(diǎn) ? 左子樹(shù)上處于左子樹(shù)上處于“最左下最左下”(沒(méi)有左子樹(shù)沒(méi)有左子樹(shù))的結(jié)點(diǎn)。的結(jié)點(diǎn)。在中序線索化鏈表中結(jié)點(diǎn)的后繼在中序線索化鏈表中結(jié)點(diǎn)的后繼 ?n若結(jié)點(diǎn)無(wú)右子樹(shù)若結(jié)點(diǎn)無(wú)右子
44、樹(shù), 則則右鏈域所指右鏈域所指結(jié)點(diǎn)即結(jié)點(diǎn)即為其后繼為其后繼;n否則對(duì)其否則對(duì)其右子樹(shù)右子樹(shù)進(jìn)行中序遍歷,進(jìn)行中序遍歷,訪問(wèn)的第一個(gè)結(jié)點(diǎn)訪問(wèn)的第一個(gè)結(jié)點(diǎn)。void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e) p = T-lchild; / T是是頭結(jié)點(diǎn)指針頭結(jié)點(diǎn)指針,p指向根結(jié)點(diǎn)指向根結(jié)點(diǎn) while (p != T) / 空樹(shù)或遍歷結(jié)束時(shí),空樹(shù)或遍歷結(jié)束時(shí),p=T while (p-LTag=Link) p = p-lchild; / 找到序列中第一個(gè)結(jié)點(diǎn)找到序列中第一個(gè)結(jié)點(diǎn) if (!Visit(p-data) re
45、turn ERROR;/訪問(wèn)左子樹(shù)為空的結(jié)點(diǎn)訪問(wèn)左子樹(shù)為空的結(jié)點(diǎn) while (p-RTag=Thread & p-rchild!=T) p = p-rchild; Visit(p-data); / 訪問(wèn)后繼結(jié)點(diǎn)訪問(wèn)后繼結(jié)點(diǎn) p = p-rchild; / p進(jìn)入其右子樹(shù)根進(jìn)入其右子樹(shù)根 / InOrderTraverse_Thr例如例如: 表達(dá)式的中序線索化鏈表的遍歷。表達(dá)式的中序線索化鏈表的遍歷。abcde-+/f-NILNIL010000110000111111001111-+abcd-*ef/thrtbtpa + b * c - d - e / fppp判斷標(biāo)志域,然后沿著指針判斷標(biāo)志域,然后沿著指針/ /線索線索訪問(wèn)后繼結(jié)點(diǎn)!訪問(wèn)后繼結(jié)點(diǎn)!n如何建立線索鏈表?如何建立線索鏈表?在中序遍歷過(guò)程
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 借款協(xié)議補(bǔ)充協(xié)議
- 旅游補(bǔ)充協(xié)議書(shū)
- 汽車(chē)工程原理與維修技術(shù)試題集解析
- 進(jìn)口產(chǎn)品合作合同協(xié)議
- 清工勞務(wù)協(xié)議書(shū)
- 永大稅務(wù)協(xié)議書(shū)
- 車(chē)輛轉(zhuǎn)讓協(xié)議和轉(zhuǎn)讓合同
- 輪值董事協(xié)議書(shū)范本
- 配電柜樓層使用協(xié)議合同
- 車(chē)輛運(yùn)輸協(xié)議合同書(shū)
- 2025年度咖啡廳員工培訓(xùn)服務(wù)合同范本
- 2025年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 夏糧收購(gòu)倉(cāng)儲(chǔ)培訓(xùn)
- 大學(xué)生心理健康教育知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋湖南中醫(yī)藥大學(xué)
- 中銅國(guó)際貿(mào)易集團(tuán)有限公司招聘筆試沖刺題2025
- 商演服務(wù)合同
- 【MOOC】園林植物應(yīng)用設(shè)計(jì)-北京林業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 【MOOC】現(xiàn)場(chǎng)急救-常熟理工學(xué)院 中國(guó)大學(xué)慕課MOOC答案
- 上海市境內(nèi)旅游合同 示范文本(2013版)
- 電路(2)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋山東大學(xué)
- 鋼構(gòu)制品加工協(xié)議
評(píng)論
0/150
提交評(píng)論