子女-兄弟鍊錶表示法,是一種二叉樹表示法。它的每個結點的度d=2,每個結點由3個域組成:
|data|firstchild|nextsibling|
左孩子右兄弟。
利用子女-兄弟鏈實現遍歷
樹的深度優先遍歷:利用遞迴進行先根次序遍歷和後根次序遍歷。
樹的廣度優先遍歷:借助佇列。在訪問某一層的結點時,掃瞄它的所有子女(循子女的右兄弟鏈),把它們依次進佇列。
//深度優先
# include
#include
"tree.h"
template
<
class
t>
void
preorder
(ostream& out, treenode
*p)}
template
<
class
t>
void
postorder
(ostream& out, treenode
*p)}
//廣度優先
#include
#include
"tree.h"
#include
"queue.h"
template
<
class
t>
void
levelorder
(ostream& out, treenode
*p)}
}
乙個關鍵碼集合k=,把它的所有元素按完全二叉樹的順序存放在乙個一維陣列中。
最小堆:任一結點的關鍵碼均小於或等於它的左右子女的關鍵碼,位於堆頂的結點關鍵碼是整個集合中最小的。
最大堆:任一結點的關鍵碼均大於或等於它的左右子女的關鍵碼,位於堆頂的結點關鍵碼是整個集合中最大的。
最小堆的下滑調整演算法:從結點start開始到m為止,自上而下比較,如果子女的值小於父結點的值,則關鍵碼小的上浮,繼續向下層比較。
template
<
classt,
class
e>
void minheap
::siftdown
(int start,
int m)
//小者上浮,i,j下降;
} heap[i]
=temp;
//調整完,將temp中暫存的元素放到最終i下滑的位置
};
堆插入的上滑調整操作與插入演算法(在已建成最小堆的最後插入新結點)
template
<
classt,
class
e>
void minheap
::siftup
(int start)
//這裡(i-1)/2中i不管是左子女還是右子女都能找到相同的父結點
} heap[j]
=temp;
}template
<
classt,
class
e>
bool minheap
::insert
(const e& x)
//堆滿
heap[currentsize]
=x;siftup
(currentsize)
; currentsize++
;return
true
;}
路徑:從樹中乙個結點到另乙個結點之間的分支構成之間的路徑。
路徑長度:指路徑上的分支條數。樹的路徑長度是從根結點到每個結點的路徑長度之和。
huffman樹:帶權路徑長度最小的二叉樹應是權值大的外結點離根結點最近的擴充二叉樹。
huffman演算法:
在f中選取兩棵根結點的權值最小的擴充二叉樹,作為左、右子樹構造一棵新的二叉樹。新的二叉樹的根結點的權值為左右子樹的權值之和。
在f中刪除這兩棵二叉樹
把新的二叉樹加入f
Huffman樹與Huffman編碼
一.哈夫曼樹概念 路徑 祖先到節點之間的分支構成一條通往節點的路徑 路徑長度 路徑上分支的數目稱為路徑長度 節點的權 給樹中節點所設的物理意義的值 節點帶權路徑長度 從根到該點路徑長度與該點權值的乘機 huffman樹就是所有樹中每點帶權路徑加和最短的樹。二.huffman樹構造步驟 1.根據每個點...
Huffman樹與Huffman編碼
huffman tree簡介 赫夫曼樹 huffman tree 又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值,如果構造一棵有n個葉子節點的二叉樹,而這n個葉子節點的權值是,則所構造出的帶權路徑長度最小的二叉樹就被稱為赫夫曼樹。這裡補充下樹的帶權路徑長度的概念。樹的帶權路徑長度指樹中所...
Huffman樹與編碼
帶權路徑最小的二叉樹稱為最優二叉樹或huffman 哈夫曼樹 b malloc n sizeof btreenode for i 0 i n i 陣列b中的指標可以理解為二叉樹的根指標。選擇b中根節點權值最小的兩棵二叉樹作為左右子樹組成新的二叉樹,新二叉樹的根節點權值為兩顆二叉樹根節點權值的和。將新...