Python數(shù)據(jù)結構之樹的全面解讀
前言
提示:以下是本篇文章正文內容
🧡基本概念
🌳樹的定義
樹是n(n≥0)個結點的有限集合,n = 0時,稱為空樹,這是一種特殊情況
在任意一棵非空樹中應滿足:
①有且僅有一個特定的稱為根的結點
②當n > 1時,其余結點可分為m(m > 0)個互不相交的有限集合T1,T2,…,Tm,其中每個集合本身又是一棵樹,并且稱為根結點的子樹==
∅ 空樹——結點數(shù)為0的樹
非空樹的特性:
有且僅有一個根節(jié)點
除了根節(jié)點外,任何一個結點都有且僅有一個前驅
每個結點可以有0個或多個后繼
🌲基本術語
1.度
(1)結點的度:結點所擁有的子樹的個數(shù)
(2)樹的度:樹中各結點度的最大值
A的度為3,同時也是樹的度,B的度為2
2.葉子節(jié)點和分支節(jié)點
(1)葉子節(jié)點
度為0的節(jié)點,也稱為終端結點
(2)分支節(jié)點
度不為0的節(jié)點,也稱為非終端結點
在上圖中,K,L,M,F,G,I,J均為葉子節(jié)點
3.雙親與孩子
(1)祖先結點:對于任何節(jié)點n ,它的祖先是位于根到節(jié)點n之間的路徑上的節(jié)點
(2)子孫結點:一個結點含有的子樹的根結點的子節(jié)點
在樹中,如果有一條路徑從節(jié)點x到節(jié)點y,則稱x為y的祖先,y為x的子孫
(3)雙親結點(父節(jié)點):若一個結點含有子結點,則這個結點稱為其子結點的父節(jié)點
(4)孩子結點:一個結點含有的子樹的根結點稱為該結點的子結點
(5)兄弟結點:具有相同父結點的結點互稱為兄弟結點
(6)堂兄弟結點:如果樹的兩個節(jié)點深度相同,但父節(jié)點不同,則它們是一對堂兄弟節(jié)點
B,C,D互為兄弟節(jié)點,E,G,I互為堂兄弟節(jié)點,B為E,F的父節(jié)點,而E,F為B的子節(jié)點
(4)樹的深度
節(jié)點所在層數(shù):根節(jié)點的層數(shù)為1,對于其他任何節(jié)點,若某節(jié)點在第K層,則其孩子節(jié)點在K+1層
樹的深度:樹中所有節(jié)點的最大層數(shù),也稱為高度
在上圖中,樹的深度為4
(5)樹的類型
有序樹:樹中結點的各子樹從左至右是有次序的,不能互換
無序樹:樹中結點的各子樹從左至右是無次序的,可以互換
注:在數(shù)據(jù)結構中,一般的討論的一般是有序樹
(6)森林
森林是m(m≥0)棵互不相交的樹的集合,m可為0,空森林
💚樹的邏輯結構
樹的遍歷:從根節(jié)點出發(fā),按照某種次序訪問樹中所有的節(jié)點,使得每個節(jié)點被訪問一次且僅被訪問一次
訪問:抽象操作,可以是對節(jié)點進行的各種處理,這里簡化為輸出節(jié)點的數(shù)據(jù)
遍歷的實質:樹的結構(非線性結構) – > 線性結構
樹通常有前序(根)遍歷,后序(根)遍歷,層序(次)遍歷三種
🍉前序遍歷
樹的前序遍歷操作定義為:若樹為空,則空操作返回;否則:
(1)先訪問根節(jié)點
(2)然后按照從左到右的順序前序遍歷根節(jié)點的每一顆子樹
如圖前序遍歷序列:A–>B–>D–>E–>H–>I–>F–>C–>G
🍓后序遍歷
樹的后序遍歷操作定義為:若樹為空,則空操作返回;否則:
(1)先按照從左到右的順序后序遍歷根節(jié)點的每一顆子樹
(2)最后訪問根節(jié)點
如圖后序遍歷序列:D–>H–>I–>E–>F–>B–>G–>C–A
🍒層序遍歷
樹的層序遍歷操作定義為:從樹的第一層(即根節(jié)點)開始,自上而下的逐層遍歷,在同一層中,按照從左到右的順序對節(jié)點逐個訪問
如圖層序遍歷序列:A–>B–>C–>D–>E–>F–>G–>H–>I
💜樹的存儲結構
實現(xiàn)樹的存儲結構,關鍵在于表示樹中的節(jié)點之間的關系
🍀雙親表示法
基本思想:用一維數(shù)組來存儲樹的各個節(jié)點(一般按層序存儲),數(shù)組中的一個元素對應樹中的一個節(jié)點,包括節(jié)點的數(shù)據(jù)信息和節(jié)點的雙親在數(shù)組中的下標。
節(jié)點結構
struct PNode { DataType data; //數(shù)據(jù)域 int parent; //指針域,雙親在數(shù)組中的下標 }
樹的雙親表示法實質上是一個靜態(tài)鏈表
如圖所示:
還可以將孩子節(jié)點或者兄弟節(jié)點的下標也進行存儲
🍁孩子鏈表表示法
將結點的所有孩子放在一起,構成線性表
基本思想:把每個結點的孩子排列起來,看成是一個線性表,且以單鏈表存儲,則n個結點共有n個孩子鏈表。這n個單鏈表共有n個頭指針,這n個頭指針又組成了一個線性表,為了便于進行查找采用順序存儲。最后, 將存放n個頭指針的數(shù)組和存放n個結點的數(shù)組結合起來,構成孩子鏈表的表頭數(shù)組
鏈表中的每個節(jié)點包含一個數(shù)據(jù)域和多個指針域,每個指針域指向該節(jié)點的一個孩子節(jié)點
方案一:
指針域的個數(shù)等于樹的深度
缺點:浪費存儲空間
方案二:
指針域的個數(shù)等于該結點的度
缺點:每個結點結構不一致
孩子節(jié)點
struct CTNode { int child; CTNode *next; // 指向下一個孩子結點的指針 }
表頭結點
struct CBNode { DataType data; CTNode *firstChild; // 每個鏈表的頭指針 }
存儲結構
🍃雙親孩子表示法
在孩子鏈表中表頭數(shù)組添加了節(jié)點的雙親結點
🍂孩子兄弟表示法
某節(jié)點的第一個孩子是唯一的,某一節(jié)點的右兄弟是唯一的,設置兩個分別指向該節(jié)點的第一個孩子和右兄弟的指針
struct TNode { DataType data; TNode *firstChild,*rightSib; }
總結
提示:這里對文章進行總結:
到此這篇關于Python數(shù)據(jù)結構之樹的全面解讀的文章就介紹到這了,更多相關Python 數(shù)據(jù)結構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
django模型層(model)進行建表、查詢與刪除的基礎教程
這篇文章主要給大家介紹了關于django模型層(model)進行建表、查詢與刪除的等基礎操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-11-11