數(shù)據(jù)結構-樹和二叉樹課件_第1頁
數(shù)據(jù)結構-樹和二叉樹課件_第2頁
數(shù)據(jù)結構-樹和二叉樹課件_第3頁
數(shù)據(jù)結構-樹和二叉樹課件_第4頁
數(shù)據(jù)結構-樹和二叉樹課件_第5頁
已閱讀5頁,還剩102頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第六章樹和二叉樹

第六章樹和二叉樹6.1樹的有關概念6.2二叉樹6.3二叉樹的遍歷6.4遍歷的應用6.5*線索二叉樹(簡單介紹)6.6樹和森林6.7哈夫曼樹及應用第六章樹和二叉樹第六章樹和二叉樹1第六章樹和二叉樹

6.1樹的有關概念1.樹的概念2.樹的應用3.樹的表示樹的有關術語5樹的基本操作第六章樹和二叉樹6.1樹的有關概念26.1

樹的有關概念1.樹的定義

定義:樹是n個結點的有限集合。在任一棵非空樹中:

(1)有且僅有一個稱為根的結點;。

(2)其余結點可分為m個互不相交的有限集合,而且這些集合中的每一集合本身又是一棵樹,稱為根的子樹。樹是遞歸結構,在樹的定義中又用到了樹的概念JIACBDHGFE樹結構(除了一個稱為根的結點外)每個元素都有且僅有一個直接前趨,有且僅有零個或多個直接后繼。6.1樹的有關概念1.樹的定義定義:樹是n個結點的有限集36.1

樹的有關概念從邏輯結構看:

1)樹中只有根結點沒有前趨;

2)除根外,其余結點都有且僅一個前趨;3)樹的結點,可以有零個或多個后繼;

4)除根外的其他結點,都存在唯一條從根到該結點的路徑;5)樹是一種分枝結構JIACBDHGFE6.1樹的有關概念從邏輯結構看:

1)樹中只有根結點46.1

樹的有關概念2.樹的應用

1)樹可表示具有分枝結構關系的對象例1.家族族譜例2.單位行政機構的組織關系、系統(tǒng)功能模塊圖6.1樹的有關概念2.樹的應用

1)樹可表示具有分枝結構56.1

樹的有關概念2)樹是常用的數(shù)據(jù)組織形式

有些應用中數(shù)據(jù)元素之間并不存在間分支結構關系,但是為了便于管理和使用數(shù)據(jù),將它們用樹的形式來組織。例3計算機的文件系統(tǒng)

不論是DOS文件系統(tǒng)還是window文件系統(tǒng),所有的文件是用樹的形式來組織的。6.1樹的有關概念2)樹是常用的數(shù)據(jù)組織形式

6MyComputerC:D:E:etcWINDOWSProgramFilesPictureMusic…………………………………………MyComputerC:D:E:etcWINDOWSPro7

6.1

樹的有關概念3、樹的基本術語1)結點的度:結點所擁有的子樹的個數(shù)。2)樹的度:樹中各結點度的最大值。CGBDEFKLHMIJADA=3DB=2DC=1DG=0DTree=36.1樹的有關概念3、樹的基本術語1)結點的度:結點8

6.1

樹的有關概念3)葉子結點:度為0的結點,也稱為終端結點。4)分支結點:度不為0的結點,也稱為非終端結點。CGBDEFKLHMIJA葉子結點:{K,L,F,G,M,I,J}分支結點:{A,B,C,D,E,H}6.1樹的有關概念3)葉子結點:度為0的結點,也稱為終9

6.1

樹的有關概念5)孩子、雙親:樹中結點的子樹的根結點稱為這個結點的孩子結點,這個結點稱為它孩子結點的雙親結點;6)兄弟:具有同一個雙親的孩子結點互稱為兄弟。

CGBDEFKLHMIJA孩子結點:{B,C,D}雙親結點:{A}兄弟結點:{E,F(xiàn)}6.1樹的有關概念5)孩子、雙親:樹中結點的子樹的根結10

6.1

樹的有關概念7)路徑:如果樹的結點序列n1,n2,…,nk有如下關系:結點ni是ni+1的雙親,則把n1,n2,…,nk稱為一條由n1至nk的路徑;路徑上經(jīng)過的邊的個數(shù)稱為路徑長度。CGBDEFKLHMIJA結點序列:{nA,nB,nE,nK}路經(jīng)長度=36.1樹的有關概念7)路徑:如果樹的結點序列n1,n11

6.1

樹的有關概念8)祖先、子孫:在樹中,如果有一條路徑從結點x到結點y,那么x就稱為y的祖先,而y稱為x的子孫。CGBDEFKLHMIJA6.1樹的有關概念8)祖先、子孫:在樹中,如果有一條路12

6.1

樹的有關概念9)結點所在層數(shù):根結點的層數(shù)為1;對其余任何結點,若某結點在第k層,則其孩子結點在第k+1層。10)樹的深度:樹中所有結點的最大層數(shù),也稱高度。1層2層4層3層高度=4CGBDEFKLHMIJC6.1樹的有關概念9)結點所在層數(shù):根結點的層數(shù)為1;13

6.1

樹的有關概念11)有序樹、無序樹:如果一棵樹中結點的各子樹從左到右是有次序的(即不能互換),稱這棵樹為有序樹;反之,稱為無序樹。ACBGFEDACBGFED數(shù)據(jù)結構中討論的一般都是有序樹

6.1樹的有關概念11)有序樹、無序樹:如果一棵樹中結14

6.1

樹的有關概念12)森林:m(m≥0)棵互不相交的樹的集合。

CBDEFKLHJA樹中每一個結點的子樹的集合即為森林。

6.1樹的有關概念12)森林:m(m≥0)棵互不相交15

6.1

樹的有關概念樹結構和線性結構的比較線性結構樹結構第一個數(shù)據(jù)元素根結點(只有一個)無前驅無雙親最后一個數(shù)據(jù)元素葉子結點(可以有多個)無后繼無孩子其它數(shù)據(jù)元素其它結點一個前驅,一個后繼一個雙親,多個孩子一對一一對多6.1樹的有關概念樹結構和線性結構的比較線性結構樹結構166.1

樹的有關概念4、樹的基本操作樹的應用很廣,應用不同基本操作也不同。下面列舉了樹的一些基本操作:

1)InitTree(&T);//構造空樹T2)DestroyTree(&T);//銷毀樹T3)CreateTree(&T,definition);//按definition構造樹T4)ClearTree(&T);//將樹T清為空樹5)TreeEmpty(T);//判斷樹T是否為空樹6)TreeDepth(T);//求樹的深度7)Root(T);//返回樹T的根值

6.1樹的有關概念4、樹的基本操作176.1

樹的有關概念

8)Value(T,&cur_e);//求樹T中結點cur_e的值9)Assign(T,cur_e,value);//把value賦值給樹T的cur_e結點10)Parent(T,cur_e);//求樹T中非根結點cur_e的雙親11)LeftChild(T,cur_e);//求樹T中非葉子結點cur_e的左孩子12)RightSibling(T,cur_e);//求樹T中cur_e結點的右兄弟13)InsertChild(&T,&p,i,c);//在樹中插入一個結點14)DeleteChild(&T,&p,i);//刪除樹中某一個結點15)TraverseTree(T,Visit());//按某種次序訪問樹中每個結點6.1樹的有關概念8)Value(T,&cur_e186.2二叉樹樹是一種分枝結構的對象,在樹的概念中,對每一個結點孩子的個數(shù)沒有限制,因此樹的形態(tài)多種多樣,本章我們主要討論一種最簡單的樹——二叉樹。6.2二叉樹樹是一種分枝196.2

二叉樹一二叉樹的概念1二叉樹的定義二叉樹:或為空樹,或由根及兩顆不相交的左子樹、右子樹構成,并且左、右子樹本身也是二叉樹。說明:1)二叉樹中每個結點最多有兩顆子樹;二叉樹每個結點度小于等于2;2)左、右子樹不能顛例——有序樹;3)二叉樹是遞歸結構,在二叉樹的定義中又用到了二叉樹的概念;ABCDEFG6.2二叉樹一二叉樹的概念說明:ABCDEFG206.2

二叉樹2.二叉樹的基本形態(tài)

Ф空二叉樹只有一個根結點右子樹根結點只有右子樹左子樹根結點只有左子樹左子樹右子樹根結點同時有左右子樹6.2二叉樹2.二叉樹的基本形態(tài)

Ф空二叉樹216.2

二叉樹二、二叉樹性質性質1在二叉樹的第i層上最多有2i-1個結點(i>=1)證明:

當i=1時,第1層只有一個根結點,結點數(shù)=20=1,結論顯然成立。假設j=i-1時,結論正確,即第j層最多有2i-2,

所以當j=i時,第i層最多有2*2i-2=2i-1;結論正確6.2二叉樹二、二叉樹性質證明:假設j=i-1時,226.2

二叉樹性質2一棵深度為k的二叉樹中,最多有2k-1個結點,最少有k個結點。

證明:由性質1可知,深度為k的二叉樹中結點個數(shù)最多==2k-1;每一層至少要有一個結點,因此深度為k的二叉樹,至少有k個結點。6.2二叉樹性質2一棵深度為k的二叉樹中,236.2

二叉樹證明:設n為二叉樹的結點總數(shù),n1為二叉樹中度為1的結點數(shù),則有:

n=n0+n1+n2

在二叉樹中,除了根結點外,其余結點都有唯一的一個分枝進入,由于這些分枝是由度為1和度為2的結點射出的,一個度為1的結點射出一個分枝,一個度為2的結點射出兩個分枝,所以有:

n=n1+2n2+1因此可以得到:n0=n2+1。CDEFGHIJ性質3在一棵二叉樹中,如果葉子結點數(shù)為n0,度為2的結點數(shù)為n2,則有:n0=n2+1。

6.2二叉樹證明:設n為二叉樹的結點總數(shù),n1為246.2

二叉樹兩種特殊的二叉樹●滿二叉樹:如果深度為k的二叉樹,有2k-1個結點則稱為滿二叉樹;CDEFGHIJKLMNO1112131415滿二叉樹的特點:葉子只能出現(xiàn)在最下一層;只有度為0和度為2的結點。滿二叉樹在同樣深度的二叉樹中結點個數(shù)最多滿二叉樹在同樣深度的二叉樹中葉子結點個數(shù)最多6.2二叉樹兩種特殊的二叉樹A1523467891256.2二叉樹●完全二叉樹深度為K,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從1至n的結點都一一對應時,稱之為完全二叉樹。CDEFGHIJCDEFGHIJKLMNO11121314156.2二叉樹●完全二叉樹A15234678910266.2二叉樹在滿二叉樹中,從最后一個結點開始,連續(xù)去掉任意個結點,即是一棵完全二叉樹。A1523467910BCDEFGHIJK11L12M13N14O158CDEFGHIJ不是完全二叉樹,結點10與滿二叉樹中的結點10不是同一個結點6.2二叉樹在滿二叉樹中,從最后一個結點開始,連續(xù)276.2二叉樹完全二叉樹的特點1.葉子結點只能出現(xiàn)在最下兩層;2.完全二叉樹中如果有度為1的結點,只可能有一個,且該結點只有左孩子。3.深度為k的完全二叉樹在k-1層上一定是滿二叉樹。A1523467910BCDEFGHIJK11L12M13N14O1586.2二叉樹完全二叉樹的特點1.葉子結點只能出現(xiàn)286.2

二叉樹性質4具有n個結點的完全二叉樹的深度為log2n+1。

CDEFGHIJ6.2二叉樹性質4具有n個結點的完全二叉樹的深296.2

二叉樹性質5對一棵具有n個結點的完全二叉樹中從1開始按層序編號,則對于任意的序號為i(1≤i≤n)的結點,有:(1)如果i>1,則結點i的雙親結點的序號為i/2(取整);如果i=1,則結點i是根結點,無雙親結點。CDEFGHIJ6.2二叉樹性質5對一棵具有n個結點的完全306.2

二叉樹(2)如果2i≤n,則結點i的左孩子的序號為2i;如果2i>n,則結點i無左孩子。CDEFGHIJ6.2二叉樹(2)如果2i≤n,則結點i的左孩子的316.2

二叉樹(3)如果2i+1≤n,則結點i的右孩子的序號為2i+1;如果2i+1>n,則結點i無右孩子。

CDEFGHIJ6.2二叉樹(3)如果2i+1≤n,則結點i的右孩326.2

二叉樹對一棵具有n個結點的完全二叉樹中從1開始按層序編號,則結點i的雙親結點為i/2;結點i的左孩子為2i;結點i的右孩子為2i+1。

二叉樹三.二叉樹存貯結構

1二叉樹的順序結構

二叉樹的順序存儲結構就是用一維數(shù)組存儲二叉樹中的結點,并且結點的存儲位置(下標)應能體現(xiàn)結點之間的邏輯關系——父子關系。

如何利用數(shù)組下標來反映結點之間的邏輯關系?完全二叉樹和滿二叉樹中結點的序號可以唯一地反映出結點之間的邏輯關系。6.2二叉樹三.二叉樹存貯結構

1二叉樹的346.2

二叉樹完全二叉樹的順序存儲CDEFGHIJ以編號為下標ABCDEFGHIJ數(shù)組下標123456789106.2二叉樹完全二叉樹的順序存儲2

二叉樹二叉樹的順序存儲ABCDFGE按照完全二叉樹編號ABCDFGE123561013ABC∧DE∧∧∧F∧∧G數(shù)組下標12345678910111213以編號為下標6.2二叉樹二叉樹的順序存儲ABCDFGE按照完全366.2

二叉樹二叉樹的順序存儲結構一般僅存儲完全二叉樹和滿二叉樹。6.2二叉樹二叉樹的順序存儲結構一376.2

二叉樹2二叉樹的鏈式存儲結構 1)基本思想:令二叉樹的每個結點對應一個鏈表結點,鏈表結點除了存放與二叉樹結點有關的數(shù)據(jù)信息外,還要設置指示左右孩子的指針。

結點結構:lchilddatarchild其中,data:數(shù)據(jù)域,存放該結點的數(shù)據(jù)信息;lchild:左指針域,存放指向左孩子的指針;rchild:右指針域,存放指向右孩子的指針。

6.2二叉樹2二叉樹的鏈式存儲結構 1)基本386.2

二叉樹二叉樹的二叉鏈表存儲表示:TypedefstructBiNode{TElemTypedata;structBiNode*lchild,*rchild;//左右孩子指針}BiNode,*BiTree;6.2二叉樹二叉樹的二叉鏈表存儲表示:396.2

二叉樹

2)二叉鏈表二叉鏈表中每個結點至少包含三個域:數(shù)據(jù)域、左指針域、右指針域

ABCDEFGGFEDBA∧∧∧∧∧∧∧∧C在n個結點的二叉樹中,有n+1個空鏈域。6.2二叉樹2)二叉鏈表ABCDEFGGFED406.2

二叉樹3)三叉鏈表三叉鏈表中每個結點至少包含四個域:數(shù)據(jù)域、雙親指針域、左指針域、右指針域結點結構:lchilddataparent其中,data:數(shù)據(jù)域,存放該結點的數(shù)據(jù)信息;parent:雙親指針域,存放指向指向雙親節(jié)點的指針;lchild:左指針域,存放指向左孩子的指針;rchild:右指針域,存放指向右孩子的指針。

rchild6.2二叉樹3)三叉鏈表結點結構:lchild416.2

二叉樹ABCDEFGA∧B∧D∧E∧F∧CG∧∧∧∧6.2二叉樹ABCDEFGA∧B∧D∧E∧F∧CG42第六章樹和二叉樹

6.3二叉樹的遍歷一.二叉樹的遍歷方法二.遍歷的遞歸算法第六章樹和二叉樹6.3二叉樹的遍歷436.3二叉樹的遍歷一、二叉樹的遍歷方法

二叉樹的遍歷是指從根結點出發(fā),按照某種次序訪問二叉樹中的所有結點,使得每個結點被訪問一次且僅被訪問一次。二叉樹遍歷操作的結果?非線性結構線性化抽象操作,可以是對結點進行的各種處理,這里簡化為輸出結點的數(shù)據(jù)。前序遍歷中序遍歷后序遍歷層序遍歷

對于線性結構由于每個結點只有一個直接后繼,遍歷是很容易的事。

二叉樹是非線性結構,每個結點可能有兩個后繼,如何訪問二叉樹的每個結點,而且每個結點僅被訪問一次?6.3二叉樹的遍歷一、二叉樹的遍歷方法二44二叉樹的遍歷方式:DLR、LDR、LRD、DRL、RDL、RLD

如果限定先左后右,則二叉樹遍歷方式有三種:前序:DLR中序:LDR后序:LRD層序遍歷:按二叉樹的層序編號的次序訪問各結點。

考慮二叉樹的組成:根結點D左子樹L右子樹R二叉樹6.3二叉樹的遍歷二叉樹的遍歷方式:如果限定先左后右,則二叉樹遍歷方式有三種:451、先序(根)遍歷若二叉樹為空,則空操作返回;否則:①訪問根結點;②先序遍歷根結點的左子樹;③先序遍歷根結點的右子樹。先序遍歷序列:ABDGCEFABCDEFG6.3二叉樹的遍歷1、先序(根)遍歷先序遍歷序列:ABDGCEFA466.3二叉樹的遍歷2、中序(根)遍歷若二叉樹為空,則空操作返回;否則:①中序遍歷根結點的左子樹;②訪問根結點;③中序遍歷根結點的右子樹。

中序遍歷序列:DGBAECFABCDEFG6.3二叉樹的遍歷2、中序(根)遍歷中序遍歷序列:DG476.3二叉樹的遍歷3、后序(根)遍歷若二叉樹為空,則空操作返回;否則:①后序遍歷根結點的左子樹;②后序遍歷根結點的右子樹;③訪問根結點。后序遍歷序列:GDBEFCAABCDEFG6.3二叉樹的遍歷3、后序(根)遍歷后序遍歷序列:GD484、層序遍歷二叉樹的層次遍歷是指從二叉樹的第一層(即根結點)開始,從上至下逐層遍歷,在同一層中,則按從左到右的順序對結點逐個訪問。

層序遍歷序列:ABCDEFGABCDEFG6.3二叉樹的遍歷4、層序遍歷層序遍歷序列:ABCDEFGABCD496.3二叉樹的遍歷ABCDEFGHK例如:先序序列:中序序列:后序序列:A

BCD

EFGHKBDC

A

EHGKFDCBHKGFE

A6.3二叉樹的遍歷ABCDEFGHK例如:先序序列:中序506.3二叉樹的遍歷二.遍歷的遞歸算法voidPreorder(BiTreeT,void(*visit)(TElemType&e)){//先序遍歷二叉樹

if(T!==NULL){

visit(T->data);//訪問結點

Preorder(T->lchild,visit);//遍歷左子樹

Preorder(T->rchild,visit);//遍歷右子樹}}先序遍歷遞歸算法6.3二叉樹的遍歷二.遍歷的遞歸算法voidPreo516.3二叉樹的遍歷二叉樹前序遍歷的非遞歸算法的關鍵:在前序遍歷過某結點的整個左子樹后,如何找到該結點的右子樹的根指針。解決辦法:在訪問完該結點后,將該結點的指針保存在棧中,以便以后能通過它找到該結點的右子樹。

先序遍歷——非遞歸算法6.3二叉樹的遍歷二叉樹前序遍歷的非遞歸算法的關鍵:在前52AGBCDFE先序遍歷算法的執(zhí)行軌跡ABDGCEFA棧內容BDGCEFAGBCDFE先序遍歷算法的執(zhí)行軌跡ABDGCEFA棧內容B531.棧s初始化;2.循環(huán)直到root為空或棧s為空2.1當root不空時循環(huán)2.1.1輸出root->data;(可將輸出變?yōu)槿魏翁幚恚?/p>

2.1.2將指針root的值保存到棧中;2.1.3繼續(xù)遍歷root的左子樹2.2如果棧s不空,則2.2.1將棧頂元素彈出至root;2.2.2準備遍歷root的右子樹;步驟:1.棧s初始化;步驟:546.3二叉樹的遍歷voidPreorder(BiTreeT,void(*visit)(TElemType&e)){InitStack(&S);p=T;while(p!==NULL||!StackEmpty(S)){if(p!==NULL){

visit(p->data);//訪問結點Push(&S,p);p=p->lchild}else{Pop(&S,&p);p=p->rchild}}先序遍歷非遞歸算法(偽代碼)6.3二叉樹的遍歷voidPreorder(BiTr556.3二叉樹的遍歷2中序遍歷遞歸算法voidInorder(BiTreeT,void(*visit)(TElemType&e)){//中序遍歷二叉樹

if(T!==NULL){Preorder(T->lchild,visit);//遍歷左子樹

visit(T->data);//訪問結點

Preorder(T->rchild,visit);//遍歷右子樹}}6.3二叉樹的遍歷2中序遍歷遞歸算法voidIno566.3二叉樹的遍歷中序遍歷非遞歸算法:voidInorder(BiTreeT,void(*visit)(TElemType&e)){InitStack(&S);p=T;while(p!==NULL||!StackEmpty(S)){if(p!==NULL){Push(&S,p);p=p->lchild}else{Pop(&S,&p);

visit(T->data);//訪問結點p=p->rchild}}6.3二叉樹的遍歷中序遍歷非遞歸算法:voidInor576.3二叉樹的遍歷3后序遍歷遞歸算法voidPostorder(BiTreeT,void(*visit)(TElemType&e)){//后序遍歷二叉樹

if(T!==NULL){Preorder(T->lchild,visit);//遍歷左子樹Preorder(T->rchild,visit);//遍歷右子樹visit(T->data);//訪問結點}}6.3二叉樹的遍歷3后序遍歷遞歸算法voidPos58若已知一棵二叉樹的前序序列和中序序列,能否唯一確定這棵二叉樹呢?怎樣確定?

例如:已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別為ABCDEFGHI和BCAEDGHFI,如何構造該二叉樹呢?

6.3二叉樹的遍歷若已知一棵二叉樹的前序序列和中序序列,能否唯一確定這棵二叉樹59先序:ABCDEFG

HI中序:BCAEDGHFI先序:BC中序:BC

BCDEFGHIA先序:DEFGHI中序:EDGHFIABCDEFGHI6.3二叉樹的遍歷先序:ABCDEFGHI先序:BCD60先序:FG

HI中序:GHFI先序:DEFGHI中序:EDGHFIABCDEFGHIABCDEFIGH6.3二叉樹的遍歷先序:FGHI先序:DEFGHIABCDE61第六章樹和二叉樹

6.4遍歷的應用1.二叉樹的基本應用2.建立二叉存儲鏈表

第六章樹和二叉樹6.4遍歷的應用626.4遍歷的應用遍歷二叉樹是二叉樹各種操作的基礎,遍歷算法中對每個結點的訪問操作可以是多種形式及多個操作,根據(jù)遍歷算法的框架,適當修改訪問操作的內容,可以派生出很多關于二叉樹的應用算法。6.4遍歷的應用遍歷二叉樹是二叉樹各種操作的基636.4遍歷的應用例1編寫求二叉樹的葉子結點個數(shù)的算法

輸入:二叉樹的二叉鏈表

結果:二叉樹的葉子結點個數(shù)基本思想:遍歷操作訪問二叉樹的每個結點,而且每個結點僅被訪問一次。所以可在二叉樹遍歷的過程中,統(tǒng)計葉子結點的個數(shù)。voidleaf(BiTreeT){//n計數(shù)二叉樹的葉子結點的個數(shù),初值n=0if(T){

if(T->lchild==null&&T->rchild==null)n=n+1;

leaf(T->lchild);leaf(T->rchild);}//if}//leafABCDEFG6.4遍歷的應用例1編寫求二叉樹的葉子結點個數(shù)的64例2

求二叉樹的結點個數(shù)。

voidCount(BiNode*root)//n為全局量并已初始化為0{if(root){Count(root->lchild);

n++;Count(root->rchild);}}6.4遍歷的應用例2求二叉樹的結點個數(shù)。voidCount(BiNod65例3、求二叉樹的深度。

intDepth(BiNode*root){if(root==NULL)return0;else{hl=Depth(root->lchild);hr=Depth(root->rchild);

returnmax(hl,hr)+1;}}6.4遍歷的應用二叉樹的深度應為其左、右子樹深度的最大值加1。例3、求二叉樹的深度。intDepth(BiNode666.4遍歷的應用

例4為二叉樹建立二叉存儲鏈表輸入:二叉樹的先序序列結果:建立二叉樹的二叉存儲鏈表

按先序編歷的順序輸入先序序列(設每個元素是一個字符),建立二叉鏈表的所有結點并完成相應結點的鏈接。為了建立一棵二叉樹,將二叉樹中每個結點的空指針引出一個虛結點,其值為一特定值如“#”,以標識其為空,把這樣處理后的二叉樹稱為原二叉樹的擴展二叉樹。6.4遍歷的應用例4為二叉樹建立二叉存儲鏈表67擴展二叉樹的先序遍歷序列:AB#D##C##DBAC#DBAC####6.4遍歷的應用擴展二叉樹的先序遍歷序列:AB#D##C##686.4遍歷的應用StatusCreateBiTree(BiTree&T){//假設擴展二叉樹的先序遍歷序列由鍵盤輸入,T為指向根結點的指針scanf(&ch);if(ch==‘#’)T=NULL;//若ch==‘#’則T=NULL返回else{//若ch!=‘’

if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=ch;//建立(根)結點CreateBiTree(T->lchild);//構造左子樹,并將左子樹根結點指針//賦給(根)結點的左孩子域CreateBiTree(T->rchild);//構造右子樹,并將右子樹根結點指針//賦給(根)結點的右孩子域}returnOK;}//CreateBiTree6.4遍歷的應用StatusCreateBiTree69

小結1二叉樹:或為空樹,或由根及兩顆不相交的左子樹、右子樹構成,并且左、右子樹本身也是二叉樹;2二叉樹即可以用順序結構存儲,也可用鏈式結構存儲;3遍歷:按某種搜索路徑訪問二叉樹的每個結點,每個結點僅被訪問一次。二叉樹的遍歷可以分解為:訪問根,遍歷左子樹和遍歷右子樹,本課程介紹了三種遍歷算法:先序遍歷、中序遍歷、后序遍歷;

70第六章樹和二叉樹

6.5線索二叉樹

1.線索二叉樹的概念2線索鏈表3.*線索二叉樹的遍歷第六章樹和二叉樹6.5線索二叉樹716.5線索二叉樹一、線索二叉樹遍歷的目的:

將二叉樹中的結點按一定規(guī)律(先、中、后序)線性化的過程。問題:當以二叉鏈表作為存儲結構時,只能找到某結點的左、右孩子信息,不能得到結點在某種遍歷序列中的前驅和后繼信息。解決辦法:◆重新遍歷,在遍歷過程中得到前驅、后繼信息。但這種動態(tài)訪問浪費時間。◆充分利用二叉鏈表的空鏈域,將遍歷過程中結點的前驅、后繼信息保留下來。6.5線索二叉樹一、線索二叉樹遍歷的目的:問題:當以72ltaglchilddatarchildrtag0:lchild指向該結點的左孩子1:lchild指向該結點的前驅結點0:rchild指向該結點的右孩子1:rchild指向該結點的后繼結點ltag=rtag=結點結構6.5線索二叉樹線索:將二叉鏈表中的空指針域指向前驅結點和后繼結點的指針被稱為線索;線索化:使二叉鏈表中結點的空鏈域存放其前驅或后繼信息的過程稱為線索化;線索二叉樹:加上線索的二叉樹稱為線索二叉樹。ltaglchilddatarchildrtag73ABCDEFGABCDEFGABCDEFGABCDEFGABDGCEFDGBAECFGDBEFCANULLNULLNULLNULL先序中序后序ABCDEFGABCDEFGABCDEFGABCDEFGAB74ABCDEFGDGBAECFNULLNULL中序找前驅結點1、P↑Ltag=1,P↑Lchild為前驅2、“根”P的前驅結點是中序遍歷P的左子樹時訪問的最后一個結點找后繼結點1、P↑Rtag=1,P↑Rchild為后繼驅2、“根”P的后繼結點是其右子樹的“最左下端”的結點ABCDEFGDGBAECFNULLNULL中序找前驅結點找75A頭指針BCDEFG∧∧∧∧∧∧00000000000000∧∧中序線索鏈表的建立過程已經(jīng)建立起二叉鏈表DGBAECFA頭指針BCDEFG∧∧∧∧∧∧0000000000000076A頭指針BCDEFG∧∧∧∧∧∧00000000000000∧∧中序線索鏈表的建立過程中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點p1DDGBAECFA頭指針BCDEFG∧∧∧∧∧∧0000000000000077A頭指針BCDEFG∧∧∧∧∧∧00000000000000∧∧中序線索鏈表的建立過程中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre1p1DGDGBAECFA頭指針BCDEFG∧∧∧∧∧∧0000000000000078A頭指針BCDEFG∧∧∧∧∧∧00000000000000∧中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11p1中序線索鏈表的建立過程DGBDGBAECFA頭指針BCDEFG∧∧∧∧∧∧0000000000000079A頭指針BCDEFG∧∧∧∧∧∧00000000000000中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11p11中序線索鏈表的建立過程DGBADGBAECFA頭指針BCDEFG∧∧∧∧∧∧0000000000000080A頭指針BCDEFG∧∧∧∧∧00000000000000中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11p111中序線索鏈表的建立過程DGBAEDGBAECFA頭指針BCDEFG∧∧∧∧∧00000000000000中81A頭指針BCDEFG∧∧∧∧00000000000000中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11p1111中序線索鏈表的建立過程DGBAECDGBAECFA頭指針BCDEFG∧∧∧∧00000000000000中序82A頭指針BCDEFG∧∧∧00000000000000中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11p11111中序線索鏈表的建立過程DGBAECFDGBAECFA頭指針BCDEFG∧∧∧00000000000000中序遍83A頭指針BCDEFG∧∧00000000000000中序遍歷二叉鏈表p為正在訪問的結點pre為剛訪問的結點pre11111111中序線索鏈表的建立過程DGBAECFDGBAECFA頭指針BCDEFG∧∧00000000000000中序遍歷84第六章樹和二叉樹

6.6樹和森林一.樹的存儲結構二.樹和二叉樹的轉換三.

樹的遍歷四.森林

第六章樹和二叉樹6.6樹和森林856.6樹和森林

一.樹的存貯結構1、雙親表示法基本思想:用一維數(shù)組來存儲樹的各個結點(一般按層序存儲),數(shù)組中的一個元素對應樹中的一個結點,包括結點的數(shù)據(jù)信息以及該結點的雙親在數(shù)組中的下標。

data

parentdata:存儲樹中結點的數(shù)據(jù)信息parent:存儲該結點的雙親在數(shù)組中的下標6.6樹和森林一.樹的存貯結構基本思想:用一維數(shù)組來存866.6樹和森林#defineMAX_TREE_SIZE100typestructPTNode//結點結構{TEleTypedata;//數(shù)據(jù)域intparent;//雙親在數(shù)組中的下標}PTNode;Typedefstruct{//樹結構PTNodenodes[MAX_TREE_SIZE]intr,n//根的位置和結點數(shù)}PTree樹的雙親表示法實質上是一個靜態(tài)鏈表。6.6樹和森林#defineMAX_TREE_SIZE876.6樹和森林012345678

A-1B0C0D1E1F1G2H2I

4ACBHFEDGI找某一結點的雙親,按照該結點的雙親下表即可找到。但求某一結點的孩子,要遍歷整個結構。6.6樹和森林0A-1AC886.6樹和森林2、孩子表示法鏈表中的每個結點包括一個數(shù)據(jù)域和多個指針域,每個指針域指向該結點的一個孩子結點。方案一:指針域的個數(shù)等于樹的度datachild1child2……childd其中:data:數(shù)據(jù)域,存放該結點的數(shù)據(jù)信息;child1~childd:指針域,指向該結點的孩子。

6.6樹和森林2、孩子表示法鏈表中的每個896.6樹和森林∧缺點:浪費空間ACBHFEDGIA∧B∧C∧D∧E∧F∧G∧H∧I∧∧∧∧∧∧∧∧∧∧∧6.6樹和森林∧缺點:浪費空間ACBHFEDGIA∧B∧906.6樹和森林方案二:

指針域的個數(shù)等于該結點的度data

degree

child1

child2

……

childd其中:data:數(shù)據(jù)域,存放該結點的數(shù)據(jù)信息;degree:度域,存放該結點的度;child1~childd:指針域,指向該結點的孩子。

6.6樹和森林方案二:指針域的個數(shù)等于該結點的度da91缺點:結點結構不一致ACBHFEDGIA2B3C2E1I0G0H0F0D06.6樹和森林缺點:結點結構不一致ACBHFEDGIA2B3C926.6樹和森林方案三:將結點的所有孩子放在一起,構成線性表?;舅枷耄?/p>

把每個結點的孩子排列起來,看成是一個線性表,且以單鏈表存儲,則n個結點共有n個孩子鏈表。這n個單鏈表共有n個頭指針,這n個頭指針又組成了一個線性表,構成孩子鏈表的表頭數(shù)組。

6.6樹和森林方案三:將結點的所有孩子放在一起,構成線性93

6.6樹和森林childnext孩子結點typedefstructCTNode{intchild;structCTNode*next;};Typedefstruct{

溫馨提示

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

評論

0/150

提交評論