樹的學習 (二)二叉樹的儲存結構及訪問

2021-10-11 20:13:54 字數 2443 閱讀 7571

1. 二叉樹的順序儲存:

用一組連續的儲存單元依次自上而下自左而右儲存完全二叉樹的結點元素。

完全二叉樹的邏輯關係的表示:利用了完全二叉樹的雙親結點和孩結點的編號規則。即雙親結點編號為i,其左孩子結點為(2i),右孩子結點為(2i+1),反之亦可。因此為了保證完全二叉樹的結點編號與記憶體陣列中的結點編號一致的話,此時應該使陣列記憶體前空一格。而這空的一格通常可以儲存二叉樹的結點個數。

如下:

對於非完全二叉樹,是不可以採用之前方法對邏輯關係進行表示。其邏輯關係表示為:

新增一下不存在的空結點,在陣列中用0表示。

順序儲存在最壞情況下會非常浪費儲存空間,比較適合完全二叉樹。如下:

2. 二叉樹的鏈式儲存

用鍊錶來存放一棵二叉樹,二叉樹中每個結點用鍊錶的乙個鏈結點來儲存。其記憶體中物理結構表示如下:

因為二叉樹最多兩個孩子結點,因此在每個鏈結點處需要有三個元素,兩個指標指向下兩個孩結點。

二叉樹的鏈式儲存定義:

typedef

struct bitnode

*bitree;

其影象表示如圖:

從上圖可以知道:含有n個結點的二叉鍊錶中,有n+1個空鏈域。過程如下:n個結點有2n個鏈域,其中總共有n-1條鏈(由結點數目比度的數目多1得到),因此可以得到有(2n-(n-1))=n+1條鏈域。

3. 二叉樹的遍歷

按某條搜尋路徑訪問樹中的每個結點,樹的每個結點均被訪問一次,而且只訪問一次。

先序遍歷

若二叉樹非空時:

(1)訪問根節點

(2)先序遍歷左子樹

(3)先序遍歷右子樹

//先序遍歷的遞迴演算法

void

preorder

(bitree t)

}

中序遍歷

若二叉樹非空時:

(1)中序遍歷左子樹

(2)訪問根節點

(3)中序遍歷右子樹

//中序遍歷的遞迴演算法

void

inorder

(bitree)

}

中序遍歷的非遞迴演算法

演算法思想:

(1)初始依次掃瞄根節點的所有左側結點並將它們一一進棧;

(2)出棧乙個結點並訪問它;

(3)掃瞄該結點的右孩子結點並將其進棧;

(4)依次掃瞄該右孩子結點的所有左側結點,並將其一一進棧;

(5)反覆該過程直至棧空為止;

後序遍歷

若二叉樹非空時:

(1)後序遍歷左子樹

(2)後序遍歷右子樹

(3)訪問根節點

//後序遍歷的遞迴演算法

void

postorder

(bitree)

}

層次遍歷:、

演算法思想:

(1)初始將根節點入隊並訪問根節點;

(2)若有左子樹則將左子樹的根入隊;

(3)若有右子樹,則將右子樹的根入隊;

(4)然後出隊,訪問該結點;

(5)反覆該過程直到佇列空為止。

void

levelroder

(bitree t)

}

注意事項:

中序遍歷和**前序遍歷(後序遍歷)**可以構成一顆確定的二叉樹。

方法:(1)首先根據前序遍歷(後序遍歷)確定樹的根節點;(2)由該根節點和中序遍歷,確定樹的左子樹和右子樹;

(3)然後對每一棵左子樹和右子樹同樣地進行上述操作,即可確定二叉樹的結構。

前序遍歷後序遍歷不可以構成一顆確定的二叉樹。

樹和二叉樹 二 二叉樹的順序儲存

順序儲存結構型別定義 define virnode 0 定義虛節點值 define max tree size 100 定義儲存空間最大值 typedef char elemtype 定義節點值型別 typedef elemtype sqbittree max tree size sqbittree...

資料結構 二叉樹 二 二叉樹的性質

滿二叉樹是每層的節點個數都達到了最多的二叉樹,如下圖所示 完全二叉樹是節點的編號順序與滿二叉樹一致,但最後一層的節點可能會在末尾連續得少一些,如下圖所示 從上往下數,第i層上最多有2 i 1 個節點。深度為k得二叉樹至多有2 k 1個節點 對任意一顆二叉樹,其終端節點 葉子節點 數為n0,度為2的節...

資料結構(三十二) 二叉樹的順序儲存

從資料儲存來看,陣列的儲存方式和數的儲存方式可以相互轉換 第n個元素的左子節點為2 n 1 第n個元素的右子節點為2 n 2 第n個元素的父節點為 n 1 2 package com.atguigu.tree public class arrbinarytreedemo 建立乙個 arrbinary...