資料結構與演算法 二叉樹

2021-09-24 03:10:16 字數 2860 閱讀 6891

啥是樹

"樹"這種資料結構和我們生活中的樹很像。裡面的每個元素我們都稱為節點,用線來連線相鄰節點之間的關係,我們叫做父子節點

樹的結構

跟 html 的結構是一樣的。

比如下面這幅圖,a 節點就是 b 節點的父節點,b 節點就是 a 的子節點。b c d 的節點都是同乙個節點,所以他們之間互稱為兄弟節點。我們把沒有父節點的節點叫做跟節點,比如圖中的 e。沒有子節點的叫做葉子節點或者葉節點,比如圖中的 g h i j k l 。

樹的概念

樹的高度、深度和層。

高度從下往上測量的,就像我們要測量乙個10層高的樓層,都是從地面開始計算,在這裡的結構也是一樣的,從最底層開始計算,計算的起點是0

深度從上向下測量,比如測量水中的深度,從水平面向下測量,的結構也是這樣的,從跟節點開始計算,計算的起點是0

和深度計算的基本一樣,只不過層是從1開始計算。

二叉樹二叉樹,每個節點最多有兩個,也就是 2 個子節點,分別是左子節點右子節點。不過,二叉樹並不要求每個節點,都有 2 個子節點。所以下面的都是

不過上圖中的 2 號 3號比較特殊些。

2 號二叉樹中,葉子節點全部都在最底層,除了葉子節點之外,每個節點都是 2 個子節點,這種的叫做滿二叉樹

3 號二叉樹中,葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後一層,其他層的節點個數都達到最大,這種的叫做完全二叉樹

儲存二叉樹

二叉樹有 2 種方法可以儲存,分別是基於指標或引用的二叉鏈式儲存法基於陣列的順序儲存法

鏈式儲存法比較簡單和直觀,是常用的二叉樹方式。每個節點都有 3 個字段,乙個儲存資料,另外 2 個是指左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整顆樹串起來。

順序儲存法基於陣列的。

根節點儲存在 i = 1 的位置。

左子節點儲存在2 * i(2 * 1 = 2) 的位置

右子節點儲存在2 * i + 1(2 * 1 + 1 = 3) 的位置

上圖中,b 節點的左子節點儲存在2 * i = 2 * 2 = 4的位置

右子節點的儲存在2 * i + 1 = 2 * 2 + 1 = 5的位置。

總結: 節點 x 儲存在陣列中的下標為 i 的位置,左子節點的位置就是下標為 2 * i,右子節點的位置就是下標為 2 * i + 1 的位置。返過來,下標為 i/2 的位置就是它的父節點,通過這種方式,我們只要知道根節點的儲存位置,就可以通過下標計算,把整顆樹串起來。

剛剛舉例的是乙個完全二叉樹,所以只浪費了乙個下標為 0 的儲存位置,如果是非完全二叉樹,會浪費更多的陣列儲存空間。比如圖下。

遍歷二叉樹

前序遍歷、中序遍歷、後序遍歷是遍歷二叉樹的三種經典方法。

前序遍歷是指對於樹的任意節點來說,先列印這個節點,然後在列印它的左子節點,最後列印右子節點。

中序遍歷是指對於樹的任意節點來說,先列印它的左子樹,在列印它的本身,最後在列印右子樹。

後序遍歷是指對於樹的任意節點來說,先列印它的左子樹,在列印它的右子樹,最後在列印這個節點本身。

未完待續…

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

資料結構與演算法 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...