




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第六章第六章樹和二叉樹樹和二叉樹6.1 樹的類型定義樹的類型定義6.2 6.2 二叉樹的類型定義二叉樹的類型定義6.3 二叉樹的存儲構造二叉樹的存儲構造6.4 二叉樹的遍歷二叉樹的遍歷6.5 線索二叉樹線索二叉樹6.6 樹和森林的表示方法樹和森林的表示方法6.7 樹和森林的遍歷樹和森林的遍歷6.8 哈夫曼樹與哈夫曼編碼哈夫曼樹與哈夫曼編碼6.1 樹的類型定義樹的類型定義數據對象數據對象 D:D是具有一樣特性的數據元素的集合。是具有一樣特性的數據元素的集合。 假設D為空集,那么稱為空樹 。 否那么: (1) 在D中存在獨一的稱為根的數據元素root; (2) 當n1時,其他結點可分為m (m0)
2、個互 不相交的有限集T1, T2, , Tm,其中每一 棵子集本身又是一棵符合本定義的樹, 稱為根root的子樹。 數據關系 R: 根本操作:查查 找找 類類 插插 入入 類類刪刪 除除 類類 Root(T) / 求樹的根結點 查找類:查找類:Value(T, cur_e) / 求當前結點的元素值求當前結點的元素值 Parent(T, cur_e) / 求當前結點的雙親結點求當前結點的雙親結點LeftChild(T, cur_e) / 求當前結點的最左孩子求當前結點的最左孩子 RightSibling(T, cur_e) / 求當前結點的右兄弟求當前結點的右兄弟TreeEmpty(T) / 斷
3、定樹能否為空樹斷定樹能否為空樹 TreeDepth(T) / 求樹的深度求樹的深度TraverseTree( T, Visit() ) / 遍歷遍歷InitTree(&T) / 初始化置空樹初始化置空樹 插入類:插入類:CreateTree(&T, definition) / 按定義構造樹按定義構造樹Assign(T, cur_e, value) / 給當前結點賦值給當前結點賦值InsertChild(&T, &p, i, c) / 將以將以c為根的樹插入為結點為根的樹插入為結點p的第的第i棵棵子樹子樹 ClearTree(&T) / 將樹清空 刪除類:
4、刪除類:DestroyTree(&T) / 銷毀樹的構造銷毀樹的構造DeleteChild(&T, &p, i) / 刪除結點刪除結點p的第的第i棵子樹棵子樹ABCDEFGHIJMKLA( B(E, F(K, L), C(G), D(H, I, J(M) )T1T3T2樹根例如例如: :() 有確定的根;() 樹根和子樹根之間為有向關系。有向樹:有向樹:有序樹:有序樹:子樹之間存在確定的次序關系。無序樹:無序樹:子樹之間不存在確定的次序關系。對比樹型構造和線性構造對比樹型構造和線性構造的構造特點的構造特點線性構造線性構造樹型構造樹型構造第一個數據元素第一個數據元素 (
5、(無前驅無前驅) ) 根結點 (無前驅)最后一個數據元素最后一個數據元素 (無后繼無后繼)多個葉子結點多個葉子結點 ( (無后繼無后繼) )其它數據元素其它數據元素( (一個前驅、一個前驅、 一個后繼一個后繼) )其它數據元素其它數據元素( (一個前驅、一個前驅、 多個后繼多個后繼) )基基 本本 術術 語語結點結點: :結點的度結點的度: :樹的度樹的度: :葉子結點葉子結點: :分支結點分支結點: :數據元素+假設干指向子樹的分支分支的個數樹中一切結點的度的最大值度為零的結點度大于零的結點DHIJM趙老根趙老根趙躍進趙躍進趙小康趙小康趙改革趙改革趙開放趙開放趙解放趙解放趙抗美趙抗美趙衛兵趙
6、衛兵趙永紅趙永紅(從根到結點的)途徑:孩子結點、雙親結點孩子結點、雙親結點兄弟結點、堂兄弟兄弟結點、堂兄弟祖先結點、子孫結點祖先結點、子孫結點結點的層次結點的層次: :樹的深度:樹的深度: 由從根到該結點所經分支和結點構成ABCDEFGHIJMKL假設根結點的層次為1,第l 層的結點的子樹根結點的層次為l+1樹中葉子結點所在的最大層次任何一棵非空樹是一個二元組 Tree = root,F其中:root 被稱為根結點 F 被稱為子樹森林森林:森林:是mm0棵互不相交的樹的集合ArootBCDEFGHIJMKLF6.2 二叉樹的類型定義二叉樹的類型定義 二叉樹或為空樹,或是由一個根結點加上兩棵分別
7、稱為左子樹和右子樹的、互不交的二叉樹組成。ABCDEFGHK根結點左子樹右子樹二叉樹的五種根本形狀:二叉樹的五種根本形狀:N空樹空樹只含根結點只含根結點NNNLRR右子樹為空樹右子樹為空樹L左子樹為空樹左子樹為空樹左右子左右子樹均不樹均不為空樹為空樹 二叉樹的主要根本操作:二叉樹的主要根本操作:查查 找找 類類插插 入入 類類刪刪 除除 類類 Root(T); Value(T, e); Parent(T, e); LeftChild(T, e); RightChild(T, e); LeftSibling(T, e); RightSibling(T, e); BiTreeEmpty(T); B
8、iTreeDepth(T); PreOrderTraverse(T, Visit(); InOrderTraverse(T, Visit(); PostOrderTraverse(T, Visit(); LevelOrderTraverse(T, Visit(); InitBiTree(&T); Assign(T, &e, value); CreateBiTree(&T, definition); InsertChild(T, p, LR, c);ClearBiTree(&T); DestroyBiTree(&T);DeleteChild(T, p, L
9、R);二叉樹二叉樹的重要特性的重要特性 性質性質 1 : 在二叉樹的第在二叉樹的第 i 層上至多有層上至多有2i-1 個個結點。結點。 (i1)用歸納法證明:用歸納法證明: 歸納基:歸納基: 歸納假設:歸納假設: 歸納證明:歸納證明:i = 1 層時,只需一個根結點:層時,只需一個根結點: 2i-1 = 20 = 1;假設對一切的 j,1 j i,命題成立;二叉樹上每個結點至多有兩棵子樹,那么第 i 層的結點數 = 2i-2 2 = 2i-1 。性質性質 2 : 深度為深度為 k 的二叉樹上至多含的二叉樹上至多含 2k-1 個結點個結點k1。證明:證明: 基于上一條性質,深度為 k 的二叉樹上
10、的結點數至多為 20+21+ +2k-1 = 2k-1 。 性質性質 3 : 對任何一棵二叉樹,假設它含有對任何一棵二叉樹,假設它含有n0 個葉子個葉子結點、結點、n2 個度為個度為 2 的結點,那么必存在關的結點,那么必存在關系式:系式:n0 = n2+1。證明:證明:設設 二叉樹上結點總數二叉樹上結點總數 n = n0 + n1 + n2又又 二叉樹上分支總數二叉樹上分支總數 b = n1+2n2 而而 b = n-1 = n0 + n1 + n2 - 1由此,由此, n0 = n2 + 1 。兩類特殊的二叉樹:兩類特殊的二叉樹:滿二叉樹:指的是滿二叉樹:指的是深度為深度為k且含有且含有2
11、k-1個結點的二叉樹。個結點的二叉樹。完全二叉樹:樹完全二叉樹:樹中所含的中所含的 n 個結個結點和滿二叉樹中點和滿二叉樹中編號為編號為 1 至至 n 的的結點一一對應。結點一一對應。123456789 10 11 12 13 14 15abcdefghij 性質性質 4 : 具有具有 n 個結點的完全二叉樹的個結點的完全二叉樹的深度為深度為 log2n +1 。證明:證明:設完全二叉樹的深度為設完全二叉樹的深度為 k 那么根據第二條性質得那么根據第二條性質得 2k-1 n 2k 即即 k-1 log2 n n,那么該結點無左孩子, 否那么,編號為 2i 的結點為其左孩子結點;(3) 假設 2
12、i+1n,那么該結點無右孩子結點, 否那么,編號為2i+1 的結點為其右孩子結點。6.3 二叉樹的存儲構造二叉樹的存儲構造二、二叉樹的鏈式二、二叉樹的鏈式 存儲表示存儲表示一、一、 二叉樹的順序二叉樹的順序 存儲表示存儲表示#define MAX_TREE_SIZE 100 / 二叉樹的最大結點數二叉樹的最大結點數typedef TElemType SqBiTreeMAX_ TREE_SIZE; / 0號單元存儲根結點號單元存儲根結點SqBiTree bt;一、一、 二叉樹的順序存儲表示二叉樹的順序存儲表示例如例如:ABCDEF A B D C E F 0 1 2 3 4 5 6 7 8 9
13、10 11 12 131401326二、二叉樹的鏈式存儲表示二、二叉樹的鏈式存儲表示1. 1. 二叉鏈表二叉鏈表2三叉鏈表三叉鏈表3 3雙親鏈表雙親鏈表4線索鏈表線索鏈表ADEBCF rootlchild data rchild結點構造結點構造:1. 1. 二叉鏈表二叉鏈表typedef struct BiTNode / 結點構造結點構造 TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指針左右孩子指針 BiTNode, *BiTree;lchild data rchild結點構造結點構造:C 言語的類型描畫如下:ADEBCF ro
14、ot 2三叉鏈表三叉鏈表parent lchild data rchild結點構造結點構造: typedef struct TriTNode / 結點構造 TElemType data; struct TriTNode *lchild, *rchild; / 左右孩子指針 struct TriTNode *parent; /雙親指針 TriTNode, *TriTree;parent lchild data rchild結點構造結點構造:C 言語的類型描畫如下:0123456B2C0A -1D2E3F4 data parent結點構造結點構造:3 3雙親鏈表雙親鏈表LRTagLRRRLABCD
15、EF1401326 typedef struct BPTNode / 結點構造 TElemType data; int *parent; / 指向雙親的指針 char LRTag; / 左、右孩子標志域 BPTNode typedef struct BPTree / 樹構造 BPTNode nodesMAX_TREE_SIZE; int num_node; / 結點數目 int root; / 根結點的位置 BPTree6.4二叉樹的遍歷二叉樹的遍歷一、問題的提出一、問題的提出二、先左后右的遍歷算法二、先左后右的遍歷算法三、算法的遞歸描畫三、算法的遞歸描畫四、中序遍歷算法的非遞歸描畫四、中序遍
16、歷算法的非遞歸描畫五、遍歷算法的運用舉例五、遍歷算法的運用舉例 順著某一條搜索途徑巡訪二叉樹中的結點,使得每個結點均被訪問一次,而且僅被訪問一次。一、問題的提出一、問題的提出“訪問的含義可以很廣,如:輸出結點的信息等。 “遍歷是任何類型均有的操作,對線性構造而言,只需一條搜索路徑(由于每個結點均只需一個后繼),故不需求另加討論。而二叉樹是非線性構造, 每個結點有兩個后繼,每個結點有兩個后繼,那么存在如何遍歷即按什么樣的搜索那么存在如何遍歷即按什么樣的搜索途徑遍歷的問題。途徑遍歷的問題。 對對“二叉樹而言,可以有二叉樹而言,可以有三條搜索途徑:三條搜索途徑: 1先上后下的按層次遍歷; 2先左子樹
17、后右子樹的遍歷; 3先右子樹后左子樹的遍歷。二、先左后右的遍歷算法二、先左后右的遍歷算法先根序的遍歷算法先根序的遍歷算法中根序的遍歷算法中根序的遍歷算法后根序的遍歷算法后根序的遍歷算法 假設二叉樹為空樹,那么空操作;否那么,1訪問根結點;2先序遍歷左子樹;3先序遍歷右子樹。先根序的遍歷算法:先根序的遍歷算法: 假設二叉樹為空樹,那么空操作;否那么,1中序遍歷左子樹;2訪問根結點;3中序遍歷右子樹。中根序的遍歷算法:中根序的遍歷算法: 假設二叉樹為空樹,那么空操作;否那么,1后序遍歷左子樹;2后序遍歷右子樹;3訪問根結點。后根序的遍歷算法:后根序的遍歷算法:三、算法的遞歸描畫三、算法的遞歸描畫v
18、oid Preorder (BiTree T, void( *visit)(TElemType& e)1 / 先序遍歷二叉樹先序遍歷二叉樹 2 if (T) 3 visit(T-data); / 訪問結點訪問結點4 Preorder(T-lchild, visit); / 遍歷左子樹遍歷左子樹5 Preorder(T-rchild, visit);/ 遍歷右子樹遍歷右子樹6 7ADB T 可以這樣了解:無論先序、中序、后序遍歷二叉樹,遍歷時的搜索道路是一樣的:從根節點出發,逆時針延二叔叉樹外緣挪動對每個節點均途徑三次。 先序遍歷:第一次經過節點時訪問。 中序遍歷:第二次經過節點時訪問。
19、 后序遍歷:第三次經過節點時訪問。AB123四、中序遍歷算法的非遞歸描畫四、中序遍歷算法的非遞歸描畫BiTNode *GoFarLeft(BiTree T, Stack *S) if (!T ) return NULL; while (T-lchild ) Push(S, T); T = T-lchild; return T;void Inorder_I(BiTree T, void (*visit) (TelemType& e) Stack *S; t = GoFarLeft(T, S); / 找到最左下的結點找到最左下的結點 while(t) visit(t-data); if (
20、t-rchild) t = GoFarLeft(t-rchild, S); else if ( !StackEmpty(S ) / 棧不空時退棧棧不空時退棧 t = Pop(S); else t = NULL; / 棧空闡明遍歷終了??贞U明遍歷終了 / while/ Inorder_I 五、遍歷算法的運用舉例五、遍歷算法的運用舉例1、統計二叉樹中葉子結點的個數、統計二叉樹中葉子結點的個數 (先序遍歷先序遍歷)2、求二叉樹的深度、求二叉樹的深度(后序遍歷后序遍歷)3、復制二叉樹、復制二叉樹(后序遍歷后序遍歷)4 4、建立二叉樹的存儲構造、建立二叉樹的存儲構造1、統計二叉樹中葉子結點的個數、統計二
21、叉樹中葉子結點的個數算法根本思想算法根本思想: : 先序(或中序或后序)遍歷二叉樹,在遍歷過程中查找葉子結點,并計數。由此,需在遍歷算法中增添一個“計數的參數,并將算法中“訪問結點的操作改為:假設是葉子,那么計數器增1。void CountLeaf (BiTree T, int& count) if ( T ) if (!T-lchild)& (!T-rchild) count+; / 對葉子結點計數對葉子結點計數 CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); / if / CountLeaf2、求二叉樹的深
22、度、求二叉樹的深度(后序遍歷后序遍歷)算法根本思想算法根本思想: : 從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加1。由此,需先分別求得左、右子樹的深度,算法中“訪問結點的操作為:求得左、右子樹深度的最大值,然后加 1 。 首先分析二叉樹的深度和它的左、右子樹深度之間的關系。int Depth (BiTree T ) / 前往二叉樹的深度前往二叉樹的深度 if ( !T ) depthval = 0; else depthLeft = Depth( T-lchild ); depthRight= Depth( T-rchild ); depthval = 1 + (dep
23、thLeft depthRight ? depthLeft : depthRight); return depthval;3、復制二叉樹、復制二叉樹其根本操作為:生成一個結點。其根本操作為:生成一個結點。根元素根元素T左子樹左子樹右子樹右子樹根元素根元素NEWT左子樹左子樹右子樹右子樹左子樹左子樹右子樹右子樹(后序遍歷后序遍歷)BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr ) if (!(T = (BiTNode*)malloc(sizeof(BiTNode) exit(1); T- data = item
24、; T- lchild = lptr; T- rchild = rptr; return T; 生成一個二叉樹的結點生成一個二叉樹的結點(其數據域為其數據域為item,左指針域為左指針域為lptr,右指針域為右指針域為rptr)BiTNode *CopyTree(BiTNode *T) if (!T ) return NULL; if (T-lchild ) newlptr = CopyTree(T-lchild);/復制左子樹 else newlptr = NULL; if (T-rchild ) newrptr = CopyTree(T-rchild);/復制右子樹 else newrpt
25、r = NULL; newT = GetTreeNode(T-data, newlptr, newrptr); return newT; / CopyTreeABCDEFGHK D C B H K G F E A例如:以下二叉樹例如:以下二叉樹的復制過程如下:的復制過程如下:newT4 4、建立二叉樹的存儲、建立二叉樹的存儲構造構造不同的定義方法相應有不同的不同的定義方法相應有不同的存儲構造的建立算法存儲構造的建立算法 以字符串的方式以字符串的方式 根根 左子樹左子樹 右子樹右子樹定義一棵二叉樹定義一棵二叉樹例如:ABCD以空白字符“ 表示A(B( ,C( , ),D( , )空樹空樹只含一個
26、根結點只含一個根結點的二叉樹的二叉樹A以字符串“A 表示以以下字符串表示Status CreateBiTree(BiTree &T) scanf(&ch); if (ch= ) T = NULL; else if (!(T = (BiTNode *)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; / 生成根結點生成根結點 CreateBiTree(T-lchild); / 構造左子樹構造左子樹 CreateBiTree(T-rchild); / 構造右子樹構造右子樹 return OK; / CreateBiTreeA B
27、 C D A BCD上頁算法執行過程舉例如下:ATBCD 按給定的表達式建相應二叉樹按給定的表達式建相應二叉樹 由先綴表示式建樹例如:知表達式的先綴表示式 -+ a b c / d e 由原表達式建樹例如:知表達式 (a+b)c d/e對應先綴表達式 -+ a b c / d e的二叉樹abcde- -+/特點:特點: 操作數為葉子結點操作數為葉子結點 運算符為分支結點運算符為分支結點scanf(&ch);if ( In(ch, 字母集字母集 ) 建葉子結點建葉子結點;else 建根結點建根結點; 遞歸建左子樹遞歸建左子樹; 遞歸建右子樹遞歸建右子樹;由先綴表示式建樹的算法的根本操作:
28、由先綴表示式建樹的算法的根本操作:a+b(a+b)c d/ea+bc 分析表達式和二叉樹的關系分析表達式和二叉樹的關系:ab+abc+abc+(a+b)cabcde- -+/根本操作根本操作:scanf(&ch);if (In(ch, 字母集字母集 ) 建葉子結點建葉子結點; 暫存暫存; else if (In(ch, 運算符集運算符集) 和前一個運算符比較優先數和前一個運算符比較優先數; 假設當前的優先數假設當前的優先數“高,那么暫存高,那么暫存; 否那么建子樹否那么建子樹; 僅知二叉樹的先序序列“abcdefg 不能獨一確定一棵二叉樹,由二叉樹的先序和中序序列建樹由二叉樹的先序和中
29、序序列建樹 假好像時知二叉樹的中序序列“cbdaegf,那么會如何? 二叉樹的先序序列二叉樹的中序序列左子樹左子樹左子樹左子樹 右子樹右子樹右子樹右子樹根根根根a b c d e f gc b d a e g f例如例如: :aab bccddeeffggabcdefg先序序列中序序列6.5線索二叉樹線索二叉樹 何謂線索二叉樹? 線索鏈表的遍歷算法 如何建立線索鏈表?一、何謂線索二叉樹?一、何謂線索二叉樹?遍歷二叉樹的結果是, 求得結點的一個線性序列。ABCDEFGHK例如:先序序列先序序列: : A B C D E F G H K A B C D E F G H K中序序列中序序列: : B
30、 D C A H G K F E B D C A H G K F E后序序列后序序列: : D C B H K G F E A D C B H K G F E A指向該線性序列中的“前驅和 “后繼 的指針,稱作“線索與其相應的二叉樹,稱作 “線索二叉樹包含 “線索 的存儲構造,稱作 “線索鏈表A B C D E F G H K D C B E 對線索鏈表中結點的商定:對線索鏈表中結點的商定: 在二叉鏈表的結點中添加兩個標志域,并作如下規定:假設該結點的左子樹不空,假設該結點的左子樹不空,那么那么Lchild域的指針指向其左子樹,域的指針指向其左子樹, 且左標志域的值為且左標志域的值為“指針指針
31、 Link; 否那么,否那么,Lchild域的指針指向其域的指針指向其“前驅,前驅, 且左標志的值為且左標志的值為“線索線索 Thread 。假設該結點的右子樹不空,假設該結點的右子樹不空,那么那么rchild域的指針指向其右子樹,域的指針指向其右子樹, 且右標志域的值為且右標志域的值為 “指針指針 Link;否那么,否那么,rchild域的指針指向其域的指針指向其“后繼,后繼, 且右標志的值為且右標志的值為“線索線索 Thread。 如此定義的二叉樹的存儲構造稱作如此定義的二叉樹的存儲構造稱作“線索鏈表。線索鏈表。typedef struct BiThrNod TElemType data;
32、 struct BiThrNode *lchild, *rchild; / 左右指針左右指針 PointerThr LTag, RTag; / 左右標志左右標志 BiThrNode, *BiThrTree;線索鏈表的類型描畫: typedef enum Link, Thread PointerThr; / Link=0:指針,指針,Thread=1:線索線索二、線索鏈表的遍歷算法二、線索鏈表的遍歷算法: for ( p = firstNode(T); p; p = Succ(p) ) Visit (p);由于在線索鏈表中添加了遍歷中得到的“前驅和“后繼的信息,從而簡化了遍歷的算法。例如例如:
33、對中序線索化鏈表的遍歷算法對中序線索化鏈表的遍歷算法 中序遍歷的第一個結點中序遍歷的第一個結點 ? 在中序線索化鏈表中結點的后繼在中序線索化鏈表中結點的后繼 ?左子樹上處于“最左下沒有左子樹的結點。假設無右子樹,那么為后繼線索所指結假設無右子樹,那么為后繼線索所指結點;點;否那么為對其右子樹進展中序遍歷否那么為對其右子樹進展中序遍歷時訪問的第一個結點。時訪問的第一個結點。void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e) p = T-lchild; / p指向根結點指向根結點 while (p != T) / 空樹或
34、遍歷終了時,空樹或遍歷終了時,p=T while (p-LTag=Link) p = p-lchild; / 第一個第一個結點結點 while (p-RTag=Thread & p-rchild!=T) p = p-rchild; Visit(p-data); / 訪問后繼結訪問后繼結點點 p = p-rchild; / p進至其右子樹根進至其右子樹根 / InOrderTraverse_Thr 在中序遍歷過程中修正結點的在中序遍歷過程中修正結點的左、右指針域,以保管當前訪問結左、右指針域,以保管當前訪問結點的點的“前驅和前驅和“后繼信息。遍歷過后繼信息。遍歷過程中,附設指針程中,附設
35、指針pre, 并一直堅持指并一直堅持指針針pre指向當前訪問的、指針指向當前訪問的、指針p所指所指結點的前驅。結點的前驅。三、如何建立線索鏈表?三、如何建立線索鏈表?void InThreading(BiThrTree p) if (p) / 對以對以p為根的非空二叉樹進展線為根的非空二叉樹進展線索化索化 InThreading(p-lchild); / 左子樹線索左子樹線索化化 if (!p-lchild) / 建前驅線索建前驅線索 p-LTag = Thread; p-lchild = pre; if (!pre-rchild) / 建后繼線索建后繼線索 pre-RTag = Thread
36、; pre-rchild = p; pre = p; / 堅持堅持 pre 指向指向 p 的前驅的前驅 InThreading(p-rchild); / 右子樹線索右子樹線索化化 / if / InThreadingStatus InOrderThreading(BiThrTree &Thrt, BiThrTree T) / 構建中序線索鏈構建中序線索鏈表表 if (!(Thrt = (BiThrTree)malloc( sizeof( BiThrNode) exit (OVERFLOW); Thrt-LTag = Link; Thrt-RTag =Thread; Thrt-rchil
37、d = Thrt; / 添加頭結點添加頭結點 return OK; / InOrderThreading if (!T) Thrt-lchild = Thrt; else Thrt-lchild = T; pre = Thrt; InThreading(T); pre-rchild = Thrt; / 處置最后一個結點處置最后一個結點 pre-RTag = Thread; Thrt-rchild = pre; 6.6 樹和森林樹和森林 的表示方法的表示方法樹的三種存儲構造樹的三種存儲構造一、雙親表示法一、雙親表示法二、孩子鏈表表示法二、孩子鏈表表示法三、樹的二叉鏈表三、樹的二叉鏈表(孩子孩子-
38、兄弟兄弟 存儲表示法存儲表示法ABCDEFG0 A -11 B 02 C 03 D 04 E 2 5 F 26 G 5r=0n=7data parent一、雙親表示法一、雙親表示法: typedef struct PTNode Elem data; int parent; / 雙親位置域 PTNode; data parent#define MAX_TREE_SIZE 100結點構造結點構造:C言語的類型描畫言語的類型描畫:typedef struct PTNode nodes MAX_TREE_SIZE; int r, n; / 根結點的位置和結點個數根結點的位置和結點個數 PTree;樹構
39、造樹構造:ABCDEFG0 A -11 B 02 C 03 D 04 E 25 F 26 G 5r=0n=7 data firstchild 1 2 34 56二、孩子鏈表表示法二、孩子鏈表表示法:-1000224typedef struct CTNode int child; struct CTNode *next; *ChildPtr;孩子結點構造孩子結點構造: child nextC言語的類型描畫言語的類型描畫: typedef struct Elem data; ChildPtr firstchild; / 孩子鏈的頭指針 CTBox;雙親結點構造雙親結點構造 data firstch
40、ildtypedef struct CTBox nodesMAX_TREE_SIZE; int n, r; / 結點數和根結點的位置結點數和根結點的位置 CTree;樹構造樹構造:ABCDEFG AB C E D F Groot AB C E D F G 三、樹的二叉鏈表三、樹的二叉鏈表 (孩子孩子-兄弟存儲表示法兄弟存儲表示法typedef struct CSNode Elem data; struct CSNode *firstchild, *nextsibling; CSNode, *CSTree;C言語的類型描畫言語的類型描畫:結點構造結點構造: firstchild data nex
41、tsibling 森林和二叉樹的對應關系森林和二叉樹的對應關系設森林設森林 F = ( T1, T2, , Tn ); T1 = (root,t11, t12, , t1m);二叉樹二叉樹 B =( LBT, Node(root), RBT );由森林轉換成二叉樹的轉換規那么為由森林轉換成二叉樹的轉換規那么為:假設 F = ,那么 B = ;否那么, 由 ROOT( T1 ) 對應得到 Node(root); 由 (t11, t12, , t1m ) 對應得到 LBT; 由 (T2, T3, Tn ) 對應得到 RBT。由二叉樹轉換為森林的轉換規那么為:由二叉樹轉換為森林的轉換規那么為:假設
42、B = , 那么 F = ;否那么,由 Node(root) 對應得到 ROOT( T1 );由LBT 對應得到 ( t11, t12, ,t1m);由RBT 對應得到 (T2, T3, , Tn)。 由此,樹的各種操作均可對應二叉樹的操作來完成。 該當留意的是,和樹對應的二叉樹,其左、右子樹的概念已改動為: 左是孩子,右是兄弟。6.7樹和森林的遍歷樹和森林的遍歷一、樹的遍歷一、樹的遍歷二、森林的遍歷二、森林的遍歷三、樹的遍歷的運用三、樹的遍歷的運用樹的遍歷可有三條搜索途徑樹的遍歷可有三條搜索途徑:按層次遍歷按層次遍歷:先根先根(次序次序)遍歷遍歷:后根后根(次序次序)遍歷遍歷: 假設樹不空,
43、那么先訪問根結點,假設樹不空,那么先訪問根結點,然后依次先根遍歷各棵子樹。然后依次先根遍歷各棵子樹。 假設樹不空,那么先依次后根遍歷假設樹不空,那么先依次后根遍歷各棵子樹,然后訪問根結點。各棵子樹,然后訪問根結點。 假設樹不空,那么自上而下自左假設樹不空,那么自上而下自左至右訪問樹中每個結點。至右訪問樹中每個結點。 A B C DE F G H I J K 先根遍歷時頂點先根遍歷時頂點的訪問次序:的訪問次序:A B E F C D G H I J K 后根遍歷時頂點后根遍歷時頂點的訪問次序:的訪問次序:E F B C I J K H G D A 層次遍歷時頂點層次遍歷時頂點的訪問次序:的訪問次
44、序:A B C D E F G H I J K B C DE F G H I J K1森林中第一棵樹的根結點;2森林中第一棵樹的子樹森林;3森林中其它樹構成的森林。森林由三部分構成:1. 先序遍歷先序遍歷森林的遍歷森林的遍歷 假設森林不空,那么訪問森林中第一棵樹的根結點;先序遍歷森林中第一棵樹的子樹森林;先序遍歷森林中(除第一棵樹之外)其 余樹構成的森林。即:依次從左至右對森林中的每一棵樹進展先根遍歷。中序遍歷中序遍歷 假設森林不空,那么中序遍歷森林中第一棵樹的子樹森林;訪問森林中第一棵樹的根結點;中序遍歷森林中(除第一棵樹之外)其 余樹構成的森林。即:依次從左至右對森林中的每一棵樹進展后根遍歷。 樹的遍歷和二叉樹遍歷的對應關系樹的遍歷和二叉樹遍歷的對應關系 ?先根遍歷先根遍歷后根遍歷后根遍歷樹樹二叉樹二叉樹森林森林先序遍歷先序遍歷先序遍歷先序遍歷中序遍歷中序遍歷中序遍歷中序遍歷設樹的存儲構造為孩子兄弟鏈表設樹的存儲構造為孩子兄弟鏈表typedef struct CSNode Elem data; struct CSNode *firstchild, *nextsibling; CSNode, *CSTree; int TreeDepth
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年生涯規劃與發展教育考試試卷及答案
- 2025年時事政治與國際關系考試試卷及答案
- 2025年旅游管理師考試試卷及答案
- 2025年量子物理學考試試卷及答案
- 2025年安全工程師職業資格考試試題及答案
- 2025年甘肅省中考化學試題卷(含答案)
- 特殊藥品勾兌管理制度
- 特殊設備使用管理制度
- 獵頭客戶合同管理制度
- 2025中國郵政集團有限公司黑龍江省分公司招聘筆試模擬試題及參考答案詳解一套
- 水表檢定記錄全冊
- 糖尿病健康知識講座課件
- EPC項目-裝飾裝修EPC總承包工程-技術標(實施計劃方案、實施技術方案、實施管理組織方案)
- 2025年熱水器內膽項目可行性研究報告
- 2025春《中考解讀 英語》 課件 專題五 讀寫綜合
- 集成灶訂購合同范例
- 藥劑學第9版課件:第一章-緒論
- 中山學校食品安全管理領導小組及職責
- 【MOOC】診斷學-山東大學 中國大學慕課MOOC答案
- 2025年中考物理考前押題密卷(哈爾濱卷)(全解全析)
- 2024-2025學年人教新目標英語八年級下冊期末綜合檢測卷(含答案)
評論
0/150
提交評論