演算法筆記 二叉樹基礎

2021-10-09 05:33:59 字數 3285 閱讀 7930

如何表示(或者儲存)一棵二叉樹?

想要儲存一棵二叉樹,我們有兩種方法,一種是基於指標或者引用的二叉鏈式儲存法,一種是基於陣列順序儲存法。

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...