資源簡介 (共37張PPT)4樹第四章AB、C、DAB、CH、I、J3236734樹與二叉樹選擇性必修1《數據與數據結構》第四章 樹4.2 二叉樹的基本操作二叉樹的建立如何建立二叉樹?可以用數組或者鏈表數據結構來實現!如何存儲完全二叉樹與非完全二叉樹?按層順序進行:先由第1層開始,依次到下一層,在每、一層中按照從左到右的順序創建節點。二叉樹的建立1.數組實現編號:從二叉樹的根節點開始,按從上而下、自左往右的順序對n個節點進行編號。根節點的編號為0,最后一個節點的編號為n-1將二叉樹的節點用一組連續的數組元素來表示,節點編號與數組的下標一一對應。(1)完全二叉樹二叉樹的建立(1)非完全二叉樹先補全為一棵完全二叉樹,補上的節點及分支用虛線表示,如圖所示;然后將補全后的完全二叉樹,對n個節點按序編號。【從根節點開始,從上而下、自左往右,范圍[0,n-1]】 依次將原二叉樹的節點用一維數組的各個元素來表示,節點編號與數組的下標—―對應。如何建立?二叉樹的數組表示ACBACB如何用數組存儲此二叉樹?數組下標 0 1 2 3 4 5 6數組元素A B C二叉樹的建立雖然,對完全二叉樹而言,一維數組的表示方式既簡單又節省存儲空間。但對于一般二叉樹來說,采用一維數組表示時,結構雖然簡單,卻容易造成存儲空間的浪費。一個深度為k,只有k個節點的樹,需要個節點的存儲空間才能表示出來。2.鏈表實現二叉樹的建立二叉鏈表:用任意一組存儲單元來存儲二叉樹的節點,用指向節點的指針來表示節點之間的關系。二叉樹可能有兩個孩子【左孩子+右孩子】因此二叉樹的節點至少需要3個域:一個數據域和兩個指針域。【左指針指向左孩子,右指針指向孩子】拓展鏈接二叉樹的list實現二叉樹節點可以看成一個三元組,元素是左、右子樹和本節點數據。Python的list可以用于組合這樣的三個元素。下面介紹用list構造二叉樹的方法。綜上,元組特點:格式: ( , , , )不可任意更改元素元組是關系數據庫中的基本概念,關系是一張表,表中的每行,即數據庫中的每條記錄是一個元組,每列就是一個屬性,在二維表里,元組也稱為行。元組和列表十分類似,只不過元組和字符串一樣是不可變的,即你不能修改元組,元組通過圓括號中用逗號分割的項目定義,元組通常用在使語句或用戶定義的函數能夠安全地采用一組值的時候,即被使用的元組的值不會改變。拓展鏈接二叉樹的list實現二叉樹節點可以看成一個三元組,元素是左、右子樹和本節點數據。Python的list可以用于組合這樣的三個元素。下面介紹用list構造二叉樹的方法。(1)空樹用None表示。(2)非空二叉樹用包含三個元素的列表[d,l,r]表示,【d:根節點;l和r兩棵子樹】[‘A’,[‘B’,’None’,’None’],[‘C’,[’D’,[’F’,’None’,’None’],[’G’,’None’,’None’]],[’E’,[’H’,’None’,’None’],[’I’,’None’,’None’]]]]二叉樹的list實現請將次二叉樹用list來表示:[‘A’,’None’,[’B’,[’C’,’None’,[’E’,’None’,’None’]],[’D’,[’F’,’None’,’None’],’None’]]]二叉樹的遍歷圖形——直觀,但在計算機處理時,需要把非線性結構 線性序列,才能方便程序的實現。通過二叉樹的遍歷即可,遍歷方式主要分為:前序遍歷、中序遍歷和后序遍歷等。1.前序遍歷規則:若二叉樹為空,則空操作返回;否則,根節點 左子樹 右子樹前序遍歷順序為:A-B-D-H-E-C-F-I-G-J-K二叉樹的遍歷2.中序遍歷規則:若二叉樹為空,則空操作返回;否則,左子樹 根節點 右子樹中序遍歷順序為:D-H-B-E-A-I-F-C-J-G-K注意事項!!!如果選取其中一種遍歷策略對二叉樹進行遍歷,對于二叉樹的左右子樹,也需遵守該遍歷原則,即二叉樹的任意一個局部都必須遵守該遍歷原則。3.后序遍歷二叉樹的遍歷規則:若二叉樹為空,則空操作返回;否則,左子樹 右子樹 根節點。后序遍歷順序為:H-D-E-B-I-F-J-K-G-C-A4.層序遍歷二叉樹的遍歷ABCDEFGHKJI層序遍歷順序為:A-B-C-D-E-F-G-H-I-J-K二叉樹的遍歷—— 習題1.請寫出下列二叉樹的四種遍歷順序:二叉樹的遍歷—— 習題例2.已知二叉樹T的前序遍歷序列為A一B一D一G一H一C一E一F,中序遍歷序列是G一D一H一B一A一E一C一F,則其后序遍歷序列是( )A.G一H一D一B一E一F一C一AB.A一B一D一G一H一C一E一FC.G一D一H一B一A一E一C一FD.A一B一C一D一E一F一G一HAABCDGHEF二叉樹的遍歷——數學表達式中序遍歷[左—根—右]: 8-(3+2*6)/5+4 【中綴表達式】后序遍歷:8 3 2 6*+5 / - 4 + 【后綴表達式/逆波蘭表達式】逆波蘭式的必要性:為確定運算順序,括號是必不可少的。后綴表達式:因為采用了運算符緊跟在兩個操作數之后的方法,從而實現了無括號處理和優先級處理,使計算機的處理規則簡化為:從左到右依序完成計算。二叉樹? 思考與練習1.寫出如圖4.2.10所示的二叉樹的前序遍歷、中序遍歷、后序遍歷的結果。前序遍歷:A B D E G H C F I J中序遍歷:D B G E H A C I J F后序遍歷:D G H E B J I F C A二叉樹? 思考與練習2.如果某二叉樹中有編號為1、2、3、4的四個節點,設計該二叉樹,使得其前序遍歷結果為1234,后序遍歷結果為4321。1234123412341234二叉樹如何確定唯一的二叉樹?前序+中序?中序+后序?前序+后序?前序遍歷【根—左—右】;中序遍歷【左—根—右】;后序遍歷【左—右—根】前序+中序,中序+后序,均可確定唯一的一棵二叉樹!!!前序 + 后序【根—左—右】 【左—右—根】雖然可確定唯一的根節點,但若左子樹/右子樹為空時,則無法確定該空子樹的位置!!!選擇性必修1《數據與數據結構》制作者:鄒修鴻第四章 樹4.3 抽象數據類型二十一世紀外國語學校抽象數據類型數據類型是程序設計領域最重要的基本概念之一,它是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。有下列Python程序語句:a=13 #語句1b=10 #語句2c=a+b #語句3print(c)語句1、語句2在給變量a和b分別賦值的同時也定義了兩個數據類型是整型的變量,而語句3中的“+”操作因為已經在整型類中已經定義,對于編程者來說,此時不必關心“+”操作的含義是如何讓計算機理解的。4.3.1 數據類型與抽象數據類型抽象數據類型抽象是指抽取出事物具有的普遍性本質,是對具體事物的一個概括。抽象是一種思考問題的方式,它隱藏了繁雜的細節,只保留實現目標所必需的信息,實現抽象化后有利于對事物的抽象,便于實現功能、提高模塊獨立性。人們對已有數據類型進行抽象,就有了抽象數據類型。抽象數據類型(ADT)是指一個數學模型及定義在該模型上的一組操作。ADT的基本思想是抽象,只需作為一個整體來研究,而與其在計算機內部如何表示和實現無關。str就是一個抽象數據類型,其操作都有明確的抽象意義,編程者不必受制于操作內部的具體實現技術,在程序設計時可以直接使用。抽象數據類型使用Python的內建函數時,編程者只需考慮函數的功能是否滿足實際需要,再確保函數調用時的表達式是否符合函數構造的要求,就可以使用此函數,而不需要知道該函數內部實現的任何具體細節。4.3.2 數據類型的描述抽象數據類型描述抽象數據類型描述如下:ADT 抽象數據類型名:Data數據元素之間邏輯關系的定義Operation操作1初始條件操作結果描述操作2……操作n……endADT!!!4.3.2 數據類型的描述線性表抽象數據類型ADT List:List(self) #創建一個新表is_empty(self) #判斷self是否為一個空表len(self) #返回表的長度prepend(self,elem) #在表頭插入元素elemappend(self,elem) #在表尾插入元素eleminsert(self,elem,i) #在表的第i位置插入元素elemdel_first(self) #刪除第一個元素del_last(self) #刪除最后一個元素search(self,elem) #查找元素elem在表中第一次出現的位置forall(self,op) #對表中的每個元素執行op操作4.3.3 抽象數據類型的作用抽象數據類型主要體現了程序設計中問題分解、抽象和信息隱藏的特征。把問題分解成多個規模較小且容易處理的問題,將每個功能模塊作為一個獨立單元,隱藏具體的實現過程,通過一次或多次的模塊調用來實現整個問題的解決。好處:使用抽象數據類型編寫出來的程序結構清晰、層次分明,便于程序正確性的證明和復雜性的分析;因為其模塊化的特點,在程序設計中容易糾正,具有很好的可維護性;由于抽象數據類型的表示和實現都可以封裝起來,便于移植和重用;因為算法設計與數據結構設計的隔開,降低了算法和程序設計的復雜度,有助于在開發過程中少出差錯,保證編寫的程序有較高的可靠性,同時,允許數據結構的自由選擇,給了算法的優化空間,提高了程序運行的效率。!!!拓 展 鏈 接簡單字符處理ADTADT String:String(self,sseq) #基于字符序列sseq建立一個字符串is_empty(self) #判斷本字符串是否為空len(self) #取得字符串的長度char(self,index) #取得字符串中位置index的字符substr(self,a,b) #取得字符串中[a:b]的子串,左閉右開區間match(self,string) #查找串string在本字符串中第一次出現的位置concat(self,string) #獲得本字符串與另一個字符串string的拼接串subst(self,str1,str2) #獲得將本字符串中的子串str1替換成str2的結果串拓 展 鏈 接隊列抽象數據類型ADTADT Queue:Queue(self) #創建空隊列is_empty(self) #判斷隊列是否為空,空時返回True,否則返回Falseenqueue(self,elem) #將元素elem加入隊列,即入隊dequeue(self) #刪除隊列里最早進的元素并將其返回,即出隊peek(self) #查看隊列里最早進入的元素,不刪除拓 展 鏈 接二叉樹抽象數據類型ADT BinTree: #一個二叉樹抽象數據類型Bin Tree(self,data,left,right) #構造操作,創建一個新二叉樹is_empty(self) #判斷self是否為一個空二叉樹num_nodes(self) #求二叉樹的節點個數data(self) #獲得二叉樹根節點存儲的數據left(self) #獲得二叉樹的左子樹right(self) #獲得二叉樹的右子樹set_left(self,btree) #用btree取代原來的左子樹set_right(self,btree) #用btree取代原來的右子樹traversal(self) #遍歷二叉樹中各節點數據的迭代器forall(self,op) #對二叉樹中的每個節點的數據中op操作建樹二叉樹的遍歷數據類型與抽象數據類型抽象數據類型的描述及其作用課堂小結學習評價對自己和同伴的表現進行客觀的評價,并思考后續完善的方向。(5=優秀,4=超出一般水平,3=滿意,2=有待改進,1=不太理想)評分項 自我評價 同學互評能從新課導入中的感知建樹的方式 5 4 3 2 1 5 4 3 2 1能理解樹的前序遍歷 5 4 3 2 1 5 4 3 2 1能自主學習樹的中序遍歷和后序遍歷,并能模擬出相應的遍歷序列 5 4 3 2 1 5 4 3 2 1能了解抽象數據類型,以及描述某種抽象數據類型和它的作用。 5 4 3 2 1 5 4 3 2 1課堂作業1.思考教材“問題與討論”中的兩個問題。謝謝觀看制作者:XXXXXX 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫