前往
大廳
主題

資料結構筆記 樹(Tree)的觀念

huninm | 2024-01-02 09:26:05 | 巴幣 0 | 人氣 101

樹(Tree)是一個非線性的圖像化資料結構

樹以節點為基礎組成,並且節點之間存在著親子關係(parent-child relationship)像是下圖的企劃關係圖就是一種樹,每一個元素都是這個樹的節點(Node而每一顆樹都只能有一個根節點(Root,像是Bushiroad就是這個企劃的根節點(Root),在一棵樹之中,除了根節點以外每一個節點都有各自的父節點 (Parent),像是下圖除了Bushiroad這個根節點以外的節點都有特定的父節點,父親可以生很多小孩,所以父節點可以有不只一個子節點 (Child),但是人不能亂認父母,所以每個子節點只能有一個父節點。

一棵樹的樹葉不會再往外長出一棵樹,所以沒有子節點的節點稱作葉節點 (leaves)或是外部節點(External nodes)像是下圖的RAS、MyGO就是。
但是樹枝可以長出其他樹枝和樹葉,所以有子節點的節點就是內部節點(Internal nodes
如果兩個節點有同一個父節點就是兄弟節點(Siblings


所以我們現在認識到一棵樹當中會有
節點 (Node):樹之中的每一個元素都稱為節點。

根節點 (Root):一棵樹只有一個根節點,同時根節點會是整個樹狀結構中最上層的節點。

外部節點(External nodes)或稱葉節點 (Leaf):所有沒有子節點的節點。

內部節點 (Internal nodes):所有有子節點的節點。

父節點 (Parent)與子節點 (Child):被分支的節點上方一個節點稱為此節點的父節點,而節點向下分支出的節點稱為子節點。如同父子關係般,父節點通常只有一個,子節點可以有一個或多個。

祖先節點 (Ancenstors) 與子孫節點 (Descendant):一個節點往上走一直到根節點之前,所經過的節點都稱為祖先節點。一個節點往下走,到外部節點前,每個經過的節點都稱為子孫節點。

兄弟節點 (Siblings):同一個父節點的其他節點,稱為兄弟節點。


接下來要知道樹的高度與深度
高度 (Height)
所有外部節點的高度為0,而其餘節點之高度為其子節點的高度+1,而一棵樹的高度就是其根節點的高度,但是值得注意地的是,如下圖一的外部節點都是高度為0,但如果像下圖二在外部節點新增一個節點,新的節點高度為0,新的節點的所有祖先高度+1,但是其他節點高度不變,我們可以理解成一個節點的高度取決於它有多少代子孫。

深度 (Depth)
根節點深度為0,其餘節點之深度為該節點之父節點的深度+1,像是D4DJ的深度就是Bushiroad的深度+1也就是1。







最後要認識兩種樹的遍歷方式
首先是
Preorder traversal前序遍歷
前序遍歷可以理解成深度優先的遍歷方式,從深度為0的根節點開始往左方的子節點開始遍歷,如果在遍歷兄弟時出現了兄弟的子節點(深度更深的節點)就在訪問完兄弟後遍歷兄弟的子節點。

或是以子樹的概念理解,將遍歷到的每一個節點都視為一棵子樹的根節點往下遍歷,完成這棵子樹的遍歷後再前往別棵子樹,如下圖Bushiroad是這個樹的根節點,所以是遍歷的起點,到了D4DJ這棵子樹後先遍歷完D4DJ這棵子樹再前往BangDream這棵子樹,在遍歷BangDream這棵子樹後在MyGO發現還有更深的子代,將MyGO視為子樹的根節點開始遍歷,遍歷完再跳出這棵子樹,以此類推。




Postorder Traversal後序遍歷
後序遍歷與前序遍歷相反,可以理解成高度優先的遍歷方式,從根節點往左方找到高度為0的子節點作為起點開始遍歷,高度最高的根節點則是終點,要是在遍歷兄弟的過程中發現兄弟有高度更低的子節點就先去遍歷兄弟的子節點。

我們同樣能以子樹的概念去理解,將遍歷到的每一個節點都視為一棵子樹的根節點往下遍歷,完成這棵子樹的遍歷後再前往別棵子樹,如下圖Bushiroad是這個樹的根節點,所以我們往左邊找到D4DJ並將這個元素與其子代視為一棵子樹,這棵子樹最左邊的子代Peaky P-key沒有更多子代了,所以是這次遍歷的起點,訪問完他的兄弟後再回去訪問這棵子樹的根節點D4DJ完成這棵子樹的遍歷再前往BangDream這棵子樹,在遍歷BangDream這棵子樹後在MyGO發現還有高度更低的子代,將MyGO視為子樹的根節點開始遍歷,遍歷完再跳出這棵子樹,以此類推,最後到達這棵樹的根節點作為遍歷的終點,結束遍歷。


創作回應

歐歐
要不要發一篇古典自由筆記
2024-01-02 11:56:24
huninm
交給你
2024-01-18 15:06:59

更多創作