森林是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 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子 森林轉換為...