#define Size 10
int
freq[Size];
string code[Size];
string word;
struct
Node
{
int
id;
int
freq;
Node *left;
Node *right;
Node(
int
freq_in):id(-1), freq(freq_in)
{
left = right = NULL;
}
};
struct
NodeLess
{
bool
operator()(
const
Node *a,
const
Node *b)
const
{
return
a->freq < b->freq;
}
};
void
init()
{
for
(
int
i = 0; i < Size; ++i)
freq[i] = 0;
for
(
int
i = 0; i < word.size(); ++i)
++freq[word[i]];
}
void
dfs(Node *root, string res)
{
if
(root->id >= 0)
code[root->id] = res;
else
{
if
(NULL != root->left)
dfs(root->left, res+
"0"
);
if
(NULL != root->right)
dfs(root->right, res+
"1"
);
}
}
void
deleteNodes(Node *root)
{
if
(NULL == root)
return
;
if
(NULL == root->left && NULL == root->right)
delete
root;
else
{
deleteNodes(root->left);
deleteNodes(root->right);
delete
root;
}
}
void
BuildTree()
{
priority_queue<Node*, vector<Node*>, NodeLess> nodes;
for
(
int
i = 0; i < Size; ++i)
{
//0 == freq[i] 的情况未处理
Node *newNode =
new
Node(freq[i]);
newNode->id = i;
nodes.push(newNode);
}
while
(nodes.size() > 1)
{
Node *left = nodes.top();
nodes.pop();
Node *right = nodes.top();
nodes.pop();
Node *newNode =
new
Node(left->freq + right->freq);
newNode->left = left;
newNode->right = right;
nodes.push(newNode);
}
Node *root = nodes.top();
dfs(root, string(
""
));
deleteNodes(root);
}