1. 程式人生 > >二叉樹與圖

二叉樹與圖

******************樹與二叉樹******************
【1】樹的概念 
樹(樹)是n(n≥0)個節點的有限集合T,
它滿足兩個條件:
有且僅有一個特定的稱為根(Root)的節點;
其餘的節點可以分為m(m≥0)個互不相交的有限集合T1,T2,......,Tm,其中每一個集合又是一棵樹,並稱為其根子樹(Subtree)。
【2】度
一個節點的子樹的個數稱為節點的度數,一棵樹的度數是指該樹中節點的最大度數
度數為零的節點稱為樹葉或終端節點,度數不為零的節點稱為分支節點,除根節點外的分支節點稱為內部節點。
一個節點的子樹之根節點稱為該節點的子節點,該節點稱為它們的父節點,同一節點的各個子節點之間稱為兄弟節點
。一棵樹的根節點沒有父節點,葉節點沒有子節點。

【3】路徑
一個節點系列k1,k2,......,ki,ki + 1,......,kj,並滿足ki是ki + 1的父節點,就稱為一條從k1到KJ 路徑,路徑的長度為J-1,即路徑中的邊數。路徑中前面的節點是後面節點的祖先,後面節點是前面節點的子孫。 
【4】高度(深度)
節點的層數等於父節點的層數加一,根節點的層數定義為一。樹中節點層數的最大值稱為該樹的高度或深度。
【5】若樹中每個節點的各個子樹的排列為從左到右,不能交換,即兄弟之間是有序的,則該樹稱為有序樹。一般的樹是有序樹。
【6】m(m≥0)棵互不相交的樹的集合稱為森林。樹去掉根節點就成為森林,森林加上一個新的根節點就成為樹。

【7】樹的邏輯結構 
樹中任何節點都可以有零個或多個直接後繼節點(子節點),但至多隻有一個直接前趨節點(父節點),根節點沒有前趨節點,葉節點沒有後繼節點。 
【8】二叉樹 
二叉樹(二叉樹)是n(n≥0)個節點的有限集合,
它或者是空集(n = 0),或者是由一個根節點以及兩棵
互不相交的,分別稱為左子樹和和右子樹的二叉樹組成。
二叉樹與普通有序樹不同,二叉樹嚴格區分左孩子和右
孩子,即使只有一個子節點也要區分左右。
【9】二叉樹的性質 
二叉樹第i(i≥1)層上的節點最多為2〜第(i-1)個。
深度為K(k≥1)的二叉樹最多有2〜K-1個節點。
在任意一棵二叉樹中,樹葉的數目比度數為2的節點的資料多一。
總節點數為各種節點之和:n = n0 + n1 + n2  

總節點數為所有子節點數加一:n = n1 + 2 * n2 + 1
故得:n0 = n2 + 1;
滿二叉樹:深度為K(k≥1)時有2K-1個節點的二叉樹。
全二叉樹:只有最下面兩層有度數小於2的節點,最下面御姐一層的葉節點集中在最左邊的若干位置上
【10二叉樹】的儲存 
當2 *i≤n時,有左孩子,其編號為2 * i,否則沒有左孩子,本身是葉節點;
當2 * i +1≤n時,有右孩子,其編號為2 * i + 1,否則沒有右孩子;
【11】二叉樹的遍歷 
先序遍歷:先訪問樹根,再訪問左子樹,最後訪問右子樹;根左右
中序遍歷:先訪問左子樹,再訪問樹根,最後訪問右子樹;根左向左向右
後序遍歷:先訪問左子樹,再訪問右子樹,最後訪問樹根;左右根
******************圖*********************
【1】定義
圖(Graph)是一種非線性資料結構,資料之間是多對多的關係
【2】有向圖(Digraph)
設Vi,Vj為圖中的兩個頂點,表示:<Vi,Vj>,Vi為弧尾,Vj為弧頭部
【3】無向圖(Undigraph)
設Vi,Vj為圖中的兩個頂點,表示:( Vi,Vj)
【4】稀疏圖(Sparse Graph)和稠密圖(Dense Graph)
弧或邊的條數量很少的圖稱為稀疏圖,反之稱為稠密圖。
【5】網(Network)
若在圖的關係<Vi,Vj>或(Vi,Vj)上附加一個值w:
【6】頂點的度(degree)

無向圖(無向圖):某一點的度的英文指與之相直接關聯的節點的個數有向圖產品(有向圖);某一點的度=出度+入度

【7】路徑)若從頂點V出發,經過某些頂點能到達另一頂點V '則稱V與V'之間存在一條路徑。若路徑(Vi1的的,Vi2的的,...... ,VIM)中頂點不重複出現,則稱其為簡單路徑;若路徑中只有第一頂點Vi1與最後一個頂點的Vim相同,則稱其為簡單迴路或簡單環(Cycle)。

【8】深度優先搜尋(深度優先搜尋,簡稱DFS)

類似樹的先根遍歷。設初始時,圖中各頂點均未被訪問,

從圖中某頂點(設為V0)出發,訪問V0,然後搜尋V0一的
個鄰接點VI中,若六未被訪問,則訪問之,再搜尋六一個的
鄰接點(深度優先)......。若某頂點的鄰接點全部訪問完畢
則回溯(回溯)到它的上一頂點,再然後從此頂點
漢語中類似的按深度優先的方法搜尋下去,......,能直到訪問的頂點都訪
問完畢為止。