資料結構 森林和最優二叉樹

2021-10-01 05:08:22 字數 2330 閱讀 4934

森林是m(m≥0)棵互不相交的樹的集合。

森林的前序遍歷:前序遍歷森林中的每一棵數。

森林的後序遍歷:後序遍歷森林中的每一棵樹。

森林通常有這兩種方式。

1.樹轉換為二叉樹

①加線——樹中所有相鄰兄弟結點之間加一條線。

②去線——對樹中的每個結點,只保留它與第乙個孩子結點之間的連線,刪去它與其他孩子結點之間的連線。

③層次調整——按照二叉樹結點之間的關係進行層次調整。

2.森林轉換為二叉樹

①將森林中的每棵樹轉換成二叉樹。

②從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子。

③按照二叉樹結點之間的關係進行層次調整。

3.二叉樹轉換為樹或森林

①加線——若某結點x是其雙親y的左孩子,則把結點x的右孩子、右孩子的右孩子、……,都與結點y用線連起來。

②去線——刪去原二叉樹中所有的雙親結點與右孩子結點的連線。

③層次調整——整理①、②兩步所得到的樹或森林,使之層次分明。

一、哈夫曼演算法

哈夫曼樹:給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。

特點:1.權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。

2.只有度為0(葉子結點)和度為2(分支結點)的結點,沒有度為1的結點。

哈夫曼演算法基本思想:

演算法:huffmantree

輸入:n個權值

輸出:哈夫曼樹

1.初始化:由給定的n個權值構造n棵只有乙個根結點的二叉樹,從而得到乙個二叉樹集合f=;

2.重複下述操作,直到集合f中只剩下一顆二叉樹

2.1選取與合併:在f中選取根結點的權值最小的兩棵二叉樹分別作為左、右子樹構造一棵新的二叉樹,這棵新二叉樹的根結點的權值為其左、右子樹根結點的權值之和。

2.2刪除與加入:在f中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到f中。

哈夫曼演算法的偽**:

演算法:huffmantree 

輸入:n個權值w[n]

輸出:哈夫曼樹huffmantree[

2n-1

]1.陣列hufftree初始化,所有元素結點的雙親、左右孩子都置為-

1。 2. 陣列hufftree的前n個元素的權值置給定值w[n]。

3. 迴圈變數k從n~n-

2進行n-

1次合併:

3.1 選取兩個權值最小的根結點,其下標分別為i1, i2。

3.2 將二叉樹i1、i2合併為一棵新的二叉樹k

(初值為n,依次遞增)。

**:

/*

weight:權值域,儲存該結點的權值;

lchild:指標域,結點的左孩子結點在陣列中的下標;

rchild:指標域,結點的右孩子結點在陣列中的下標;

parent:指標域,該結點的雙親結點在陣列中的下標。

*/struct element

;void

huffmantree

(element hufftree,

int w,

int n)

for(i=

0; i

) hufftree [i]

.weight=w[i]

;for

(k=n; k<

2*n-

1; k++

)}

資料結構 樹 與 二叉樹 森林

一 常用術語 1 樹的節點 2 節點路徑 從根節點到該節點所經歷的節點和分支的順序。3 路徑長度 節點路徑包含的分支數。4 節點的度 節點擁有的子樹的數目。5 樹的度 所有節點的度 中 的最大值。6 葉子節點 終端節點 樹中 節點的度為0的節點。7 分支節點 非終端節點 樹中 節點的度不為0的節點。...

樹 森林轉二叉樹(資料結構)

樹轉二叉樹 1 加線 在所有兄弟結點之間加一條連線。2 去線 樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整 以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子 森林轉換為二叉...

資料結構 樹 森林和二叉樹的轉換

樹轉換為二叉樹 1 加線。在所有兄弟結點之間加一條連線。2 去線。樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子 森林轉換為...