如何表示(或者儲存)一棵二叉樹?
想要儲存一棵二叉樹,我們有兩種方法,一種是基於指標或者引用
的二叉鏈式儲存法,一種是基於陣列
的順序儲存法。
1. 鏈式儲存
每個節點有三個字段,其中乙個儲存資料,另外兩個是指向左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整棵樹都串起來。這種儲存方式我們比較常用。大部分二叉樹**都是通過這種結構來實現的。
2. 基於陣列的順序儲存法
把根節點儲存在下標 i = 1 的位置,那左子節點儲存在下標 2 * i = 2 的位置,右子節點儲存在 2 * i + 1 = 3 的位置。以此類推,b 節點的左子節點儲存在 2 * i = 2 * 2 = 4 的位置,右子節點儲存在 2 * i + 1 = 2 * 2 + 1 = 5 的位置。
思考:根節點儲存在下標為1的位置,而不是0的位置,有可能和二進位制位有關。
下表用4位二進位制數來表示圖中完全二叉樹的示例:
根節點左節點
右節點0001
0010
0011
0010
0100
0101
0011
0110
0111
0100
1000
1001
0101
1010
1011
可以發現:
左節點下標
=根節點下標
右移1位
右節點下標
=根節點下標
右移1位 + 1
如果根節點下標從0開始,就不好運算了…
如果是非完全二叉樹,且以陣列的形式儲存,在相應空白結點
處還是會浪費空間的。所以完全二叉樹使用陣列來儲存,空間浪費最少。
二叉樹的屬性
關於「樹」,還有三個比較相似的概念:高度(height)、深度(depth)、層(level)。它們的定義是這樣的:
以下圖為例:
王爭老師對於二叉樹的個人理解:
「高度」
這個概念,其實就是從下往上度量,比如我們要度量第 10 層樓的高度、第 13 層樓的高度,起點都是地面。所以,樹這種資料結構的高度也是一樣,從最底層開始計數,並且計數的起點是 0。
「深度」
這個概念在生活中是從上往下度量的,比如水中魚的深度,是從水平面開始度量的。所以,樹這種資料結構的深度也是類似的,從根結點開始度量,並且計數起點也是 0。
「層數」
跟深度的計算類似,不過,計數起點是 1,也就是說根節點位於第 1 層。
二叉樹的遍歷
經典的方法有三種,前序遍歷
、中序遍歷
和後序遍歷
。其中,前、中、後序,表示的是節點與它的左右子樹節點遍歷列印的先後順序。
這裡使用了遞迴的知識,具體**實現引自wiki:
前序遍歷
visit
(node)
print node.value
if node.left != null then visit
(node.left)
if node.right != null then visit
(node.right)
中序遍歷
visit
(node)
if node.left != null then visit
(node.left)
print node.value
if node.right != null then visit
(node.right)
後序遍歷
在這個二叉樹中,
前序遍歷
的結果:m,g,d,b,a,c,f,e,j,h,i,k,l,s,p,o,n,q,r,w,u,t,v,x,z,y
中序遍歷
的結果:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
後序遍歷
的結果:a,c,b,e,f,d,i,h,l,k,j,g,n,o,r,q,p,t,v,u,y,z,x,w,s,m
對於各個遍歷過程的個人理解:
前序遍歷:
中序遍歷:
用二叉樹表示下述表示式:a+b*(c-d)-e/f (又是取走最左邊元素…同時)
小結:遍歷二叉樹:l、d、r分別表示遍歷左子樹、訪問根結點和遍歷右子樹,則先(根)序遍歷二叉樹的順序是dlr,中(根)序遍歷二叉樹的順序是ldr,後(根)序遍歷二叉樹的順序是lrd。還有按層遍歷二叉樹。這些方法的時間複雜度都是o(n),n為結點個數。
演算法筆記 二叉樹,二叉搜尋樹筆記(python)
二叉樹筆記 1.基本概念 1 根節點 2 葉節點 2.樹 圖 鍊錶之間的關係 1 鍊錶是特殊化的樹,例如一棵樹只有左子節點,而沒有右子節點 或者一棵樹只有右子節點,而沒有左子節點。如下圖。3.二叉樹,python定義 class treenode def init self,val self.val...
熱門基礎演算法筆記 二叉樹遍歷
public int jiecheng int n 遞迴結束條件 else return res 簡單理解 根左右 也可照這個記憶 arraylist list newarraylist 定義乙個集合來存 public arraylist xx treenode root 簡單理解 左根右 也可照這...
演算法基礎之二叉樹
本文主要包括樹相關的演算法,二叉樹結點基本結構如下 function treenode x 本文還會繼續更新。function depth proot var depth 0 var currdepth 0 dfs proot return depth function dfs node currd...