學習筆記 樹和二叉樹的初步學習2

2021-06-22 20:29:36 字數 1933 閱讀 4322

三、樹和森林

1、樹的儲存結構

常用的鍊錶結構:

a.雙親表示法

以一組連續空間儲存樹的結點,同時,結點結構中附設乙個指示其雙親結點在鍊錶中的位置的指示器。

#define max_tree_size 50

typedef struct ptnodeptnode;

typedef structptree;

這種儲存結構利用了除根結點以外的每個結點只有乙個雙親的性質,parent(t,x)函式可找到其雙親。反覆呼叫parent函式,直到遇到無雙親的結點時,便找到了樹的根。

在這種表示法中,求結點的孩子時很不方便。

2、孩子表示法

這種表示方法是把每個結點的孩子結點排列起來,看成是乙個線性表,每個孩子結點以單鏈表作為儲存結構,則n個結點有n個孩子鍊錶(葉子結點的孩子鍊錶為空表)。而n個頭指標又組成乙個線性表,為了便於查詢,採用順序儲存結構。

typedef struct ctnode*childptr;

typedef structctbox;

typedef structctree;

這種表示法便於實現關於結點孩子的操作。

可以把雙親表示法和孩子鍊錶結合起來,可以實現關於兩頭的操作。

c.孩子兄弟表示法

此又稱為二叉鍊錶表示法。鍊錶中每個節點有兩個鏈域,分別指向該結點的第乙個孩子結點和下乙個兄弟結點。

這樣,將樹轉化為二叉樹,以二叉鍊錶形式儲存。

typedef struct csnodecsnode,*cstree;

給定一棵樹,可以找到唯一的一棵二叉樹與之對應。從物理結構方面,它們的二叉鍊錶是相同的,只是域的名稱不同、解釋不同而已。

任何一顆和樹對應的二叉樹,其右子樹必空。

2.森林與二叉樹的轉換

按照樹與二叉樹的對應關係,將森林中第二棵樹的根結點看成是第一棵樹的根結點的兄弟,那麼,森林也可轉化為二叉樹。

這時的二叉樹有右子樹。

森林和樹的操作可轉換為二叉樹的操作。

3.樹和森林的遍歷

兩種遍歷樹的方法:

一種是先根(次序)遍歷樹。即先訪問樹的根結點,然後依次先根遍歷根的每棵子樹。

另一種是後根(次序)遍歷,即先依次後根遍歷每棵子樹,再訪問根結點。

森林由三部分組成:①第一棵樹的根節點;②第一棵樹的子樹森林;③除第一棵樹以外的其他樹構成的森林。

按照森林和樹相互遞迴的定義,可推出森林的兩種遍歷方法:先序遍歷和中序遍歷。

遍歷對應關係:

樹的先根遍歷<——>二叉樹先序遍歷<——>森林先序遍歷

樹的後根遍歷<——>二叉樹中序遍歷<——>森林中序遍歷

注意:森林的中序遍歷指依次從左至右對森林中每棵樹進行後根遍歷。

借用二叉樹的先序和中序遍歷演算法可實現遍歷樹和森林。因此二叉樹的遍歷是很重要的。

四、赫夫曼樹

赫夫曼樹又稱最優樹,是一類帶權路徑長度最短的樹。

1、最優二叉樹

路徑上的分支數目稱為路徑長度。

樹的路徑長度:從樹根到每一結點的路徑長度之和。

樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和。

帶權路徑長度最小的二叉樹稱作最優二叉樹或赫夫曼樹。

2、赫夫曼編碼

進行快速遠距離通訊時,將需傳送的文字轉換成由二進位制的字元組成的字串,並且總長盡可能短,以提高傳送效率。

可以對每個字元設計長短不同的編碼,讓電文中出現次數角度的字元採用盡可能短的編碼,則電文總長可大大減少。

要設計長短不等的編碼,必須是任乙個字元的編碼都不是另乙個字元的編碼的字首,這種編碼稱作字首編碼。

設計電文總長最短的二進位制字首編碼,即為設計一顆赫夫曼樹的問題,權值為n種字元出現的頻率。每條路徑形成的編碼為赫夫曼編碼。

總結:二叉樹的遍歷是重中之重。學會樹和森林與二叉樹的轉換。

二叉樹學習筆記2

二叉搜尋樹 bst binary search tree的首字母大寫構成。特點 它是乙個特殊的二叉樹,樹中的結點必須滿足 根節點的值大於左子樹的值且小於右子樹的值。即 根 左,根 右。下面,我們來看二叉樹的建立 我們知道,二叉樹的結點不僅包括資料,還包含指向子節點的指標。所以,每個結點就應該用結構體...

學習筆記 樹 二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。本題主要採用遞迴的思想。首先介紹一下根據前序遍歷和中序遍歷來構建二叉樹的思路 前序遍歷的第乙個則是二叉樹的根,找到根在中序遍歷中的位...

二叉樹 樹的學習(2)

二叉樹節點的宣告為 typedef struct treenode tree struct treenode構建表達樹 一棵表達樹是這樣的 葉節點都是運算元,其他樹節點是操作符。我們把字尾表示式構建成一棵表達樹是這樣子的 我們一次乙個符號的讀入表示式,如果符號是運算元,那麼我們就建立乙個單節點樹並將...