3.樹的說明
樹:t=。k是包含n個結點的有窮集合(n>0),關係r滿足以下條件:
(1)有且僅有乙個結點k0∈k,它對於關係r來說沒有前驅結點,結點k0稱作樹的根。
(2)除結點k0外,k中的每個結點對於關係r來說都有且僅有乙個前驅結點。
(3)k中每個結點對於關係r來說可以有多個後繼結點。
我這裡主要討論的是二叉樹,因為這個是用的最廣泛的,二叉樹也稱為二次樹或二分樹,它是有限的結點集合,這個集合或者是空,或者由乙個根結點和兩棵互不相交的稱為左子樹和右子樹的二叉樹組成。
二叉樹的節點定義形式如下:
class treenode
假如我們有這樣一棵樹
2/ \
4 5/ \/ \
7 310 8
/\ /
1 9 6
1)樹的遍歷:就是訪問所有的節點一遍。一般來說,有四種遍歷的方式,前序遍歷:先訪問節點本身,在訪問左子樹,之後再訪問右子樹,例如上面的樹,前序遍歷的次序是2 4 7 1 9 3 6 5 10 8;中序遍歷,就是先訪問左子樹,再訪問節點本身,最後訪問右子樹,上面的樹中序遍歷的次序是1 7 9 4 6 3 2 10 5 8;後序遍歷,就是先訪問左子樹,再訪問右子樹,最後訪問節點,上面的樹後序遍歷的次序是1 9 7 6 3 4 10 8 5 2;層次遍歷就是按層次訪問樹的節點,上面的樹層次遍歷的屬次序是2 4 5 7 3 10 8 1 9 6
具體**實現,可以採用遞迴的方式實現,也可以採用非遞迴的方式實現。
前序遍歷:
public static void preorder(treenode root)
中序遍歷:
public static void inorder(treenode root)
後序遍歷:
public static void postorder(treenode root)
層次遍歷:
public static void layerorder(treenode root)
}
我前面已經說過,使用遞迴只不過由系統在為我們維護乙個呼叫棧,我們也可以具體明確的使用堆疊來非遞迴的實現樹的遍歷。
非遞迴實現樹的遍歷,我們先構建好一棵樹,初始化乙個棧,之後我們進入乙個迴圈,我們不斷彈出堆疊裡的元素,直到堆疊為空,如果彈出的樹節點表示一棵空樹,我們就訪問此節點,否則,我們根據下面的規則執行一系列的push操作。
對於前序:壓入右子樹,然後是左子樹,再後是節點
對於中序:壓入右子樹,然後是節點,再後是左子樹
對於後序:壓入節點,然後是右子樹,再後是左子樹
當我們把乙個節點的左右節點及本節點都入棧後,我們的節點本身就可以看成一棵空樹了。為了標識這一特性,我們修改樹節點為:
class treenode
前序遍歷的**:
public static void preorder(treenodenode)else
}}
中序遍歷的**:
public static void preorder(treenodenode)else
}}
後序遍歷的**:
public static void preorder(treenodenode)else
}}
基本資料結構的說明(二)
2.棧和佇列 所謂的棧,是乙個含有至少兩個基本操作的抽象資料型別 插入新的元素 刪除最近時間插入的元素。遵循 filo first in last out 先進後出 的原則。所謂的佇列,也是乙個含有至少兩個基本操作的抽象資料型別 插入新的元素 刪除最久時間插入的元素。遵循 fifo first in...
(三)基本資料結構 佇列
三 具體 實現 陣列佇列的實現 佇列作為最常見的資料結構之一,其作用不言而喻。我將自定義乙個佇列的類,該佇列是基礎之前所學習的動態陣列實現的。本文實現了陣列佇列與迴圈佇列兩種資料結構。由於棧是fifo first in first out 型別,則棧的增刪只存在入隊enqueue 和出隊dequeu...
python中基本資料結構(三)
鍊錶是一種非連續性的資料結構,資料元素的邏輯順序是按照鍊錶的指標實現,所以鍊錶由一系列的節點組成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。class node def init self,num,next none self.num num self.n...