幾個基本概念:
路徑:從樹中的乙個結點到另乙個結點之間的分支構成這兩個結點間的路徑。
路徑長度:路徑上的分支數。
樹的路徑長度:從樹的根結點到每個結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。
結點的權:在一些應用中,賦予樹中結點的乙個有實際意義的數。
結點的帶權路徑長度:從該結點到樹的根結點的路徑長度與該結點的權的乘積。
樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和
哈夫曼樹又叫最優二叉樹,值得是對於一組具有確定權值的葉子結點的具有最小帶權路徑長度的二叉樹。
構造哈夫曼樹的方法:
1>根據給定的n個權值,構造n棵只有根結點的二叉樹集合f=;
2>從集合f中選取兩棵根結點的權最小的二叉樹作為左右子樹,構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左、右子樹根結點權值之和。
3>在集合f中刪除這兩棵樹,並把新得到的二叉樹加入到集合f中;
4>重複上述步驟,直到集合中只有一棵二叉樹為止,這棵二叉樹就是哈夫曼樹。
結點類:
哈夫曼樹的構造:class newnode
set
}public
int lchild set }
public
int rchild set }
public
int parent set }
public
newnode()
public
newnode(int w, int l, int r, int p)
}
class huffmantree
set }
public
int leafnum set }
public
huffmantree(int n)
public
void
createhuffmantree()
for (int i = 0; i < leafnum-1; i++)
else
if (data[j].weight < m2 && data[j].parent == -1)
}data[temp1].parent = data[temp2].parent = leafnum + i;
data[leafnum + i].weight = data[temp1].weight + data[temp2].weight;
data[leafnum + i].lchild = temp1;
data[leafnum + i].rchild = temp2;}}
}
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼樹
哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...