大話資料結構 (五)二叉樹的來由

2021-10-04 11:55:18 字數 2270 閱讀 2720

在這次學習之前,在學校課程內也學過資料結構這門課,當時也只是臨時抱佛腳應付考試。提到樹,我的第一映像是,它得先建立乙個結點,結點的內容包括該結點的值和兩個結點指標。。。現在想起來還真有點此處省略一萬字

下面正式進入主題,既然線性結構裡面分為順序儲存結構和鏈式儲存結構,那麼樹的儲存結構會不會也是類似的呢。樹中某個結點的孩子可以有多個,如果將這些結點儲存到陣列中,結點的儲存位置是無法反應邏輯關係的。不過,充分利用順序儲存和鏈式儲存結構的特點,完全可以實現對樹的儲存結構的表示。這裡介紹三種表示法:雙親表示法,孩子表示法,孩子兄弟表示法。雖然這些方法在運用中很少用到,但在了解最終解決方案之前,前面所有的鋪墊都是值得品味的。

(一)雙親表示法:

在樹中,除了根結點外,其餘每個結點,它不一定有孩子,但是一定有且只有乙個雙親。我們假設以一組連續的空間儲存結點,每個結點儲存的資訊包括:它自身的內容,以及它的雙親(雙親是乙個結點,只不過,雌雄同體。。?)結點的結構如圖所示。

//樹結點的資料型別,目前暫定為整型

typedef

struct ptnodeptnode;

typedef

struct

ptree;

下面舉乙個例項,加深雙親表示法的理解,樹狀圖如下:

(二)孩子表示法:

每個結點有多個指標域,其中每個指標指向一棵子樹的根結點(或叫該結點的孩子),我們把種方法叫做多重鍊錶表示法。具體方案是:每個結點指標域的個數等於該結點的度,我們專門取乙個位置來儲存結點指標域的個數,其結構如表所示。

其中data為資料域,degree為度域,也就是儲存該結點的孩子結點的個數,child1到childn為指標域,指向該結點的各個孩子的結點。

對於上圖的樹來說,這種方法實現如圖所示:

這就是我們要講的孩子表示法。具體方法是,把每個結點的孩子結點排列起來,以單鏈表作儲存結構,則n個結點有n個孩子鍊錶,如果是葉子結點則此單鏈表為空。然後n個頭指標又組成乙個線性表,採用順序儲存結構,存放乙個一維陣列中,如圖所示:

#define max_tree_size 100

typedef

struct ctnode

*childptr;

typedef

struct

ctbox;

typedef

struct

ctree;

(三)孩子兄弟表示法:也許你會認為,孩子表示法已經可以滿足大部分需求了,確實,那為什麼還要想出這麼乙個孩子兄弟表示法呢,是因為不夠完美嗎。這裡主要是將普通的樹統一轉換成乙個特殊的樹,這樣就可以有統一的操作方法。孩子兄弟表示法,就是化大眾為特殊的乙個方法,任意一棵樹,它的結點的第乙個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們設定兩個指標,分別指向該結點的第乙個孩子和此結點的右兄弟(真的是漲知識了,以前一直以為是左孩子和右孩子,想想也說不通,現在徹底說通了),結點結構如表所示。

結構定義**如下:

typedef

struct csnodecsnode,

*cstree;

對於上圖的樹來說,孩子兄弟表示方法實現的示意圖如圖所示:

資料結構 五 二叉樹(Binary Tree)

二叉樹 binary tree 是n n 0 個結點的有限集合,該集合或者空集 空二叉樹 或由乙個結點和兩棵互不相交的 分別稱為根結點的左子樹和右子樹的二叉樹組成。圖5.1 1 每個結點最多兩棵樹,所以二叉樹的結點的度最大為2 2 左子樹和右子樹是有序的 3 即使樹中某結點只有一棵樹,也要區分它是左...

資料結構 五 二叉樹 堆

實現乙個二叉查詢樹,並且支援插入 刪除 查詢操作 實現乙個二叉查詢樹,並且支援插入 刪除 查詢操作 typedef char datatype typedef struct bnode btnode,btptr createlbtree btptr bt 建立以bt為根節點指標的二叉鍊錶結構 i 節...

資料結構學習筆記五 二叉查詢樹

二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。它是特殊的二叉樹 對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key x 如果y是x的左子樹中的乙個結點,則key y key x 如果y是x的右子樹的乙個結點,則key y key x...