最優二叉樹 赫爾曼樹(學習記錄)

2021-07-27 08:06:07 字數 771 閱讀 3088

注意vector儲存的記憶體位址可能會變,所以如果用vector來儲存所有節點的話,需要先resize好容器,保證期間不進行節點的增減。multiset是允許關鍵字重複的容器

#include

#include

#include

#include

using

namespace

std;

struct node

bool

operator

<(const node b) const

};multiset

all;

vector

resault;//最終的所有節點

int n;

void dfs(node *&root)//赫爾曼編碼

if (root->r)

}int main()

while (all.size() != 1)//選2個最小的到resault中,並建立乙個最小合併的節點到all

resault[cnt++] = *all.begin();

//遍歷,求所求//比如赫爾曼碼

node *root = &resault[resault.size() - 1];

dfs(root);

for (auto x : resault)

if (x.flag == 1) cout

<< x.data << " "

<< x.ma << endl;

}

哈夫曼樹,最優二叉樹,最優多叉樹

最優樹適用 當多個物體各自帶有權值 不同的出現頻率 要對每個物體進行編碼,以使得每個物體的權值 該物體編碼長度之和最小 即最多出現的物體編碼最短 且每個物體的編碼不能是其他物體編碼的字首。這時可使用哈夫曼樹 最優二叉樹 求解。最優多叉樹 一般的哈夫曼樹為二進位制,當需要k進製時,每次選取最小的k個節...

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

哈夫曼樹(最優二叉樹)

最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...