最优二叉树、赫尔曼树(学习记录)

注意vector保存的内存地址可能会变,所以如果用vector来存储所有节点的话,需要先resize好容器,保证期间不进行节点的增减。multiset是允许关键字重复的容器

#include<vector>
#include<iostream>
#include<string>
#include<set>
using namespace std;
struct node {
    string data;
    int w;//权值或概率
    string ma;
    node *l, *r;
    int flag;
    node() { l = r = NULL;ma = "";flag = 0; }
    bool operator<(const node b) const {
        return w < b.w;
    }
};
multiset<node> all;
vector<node> resault;//最终的所有节点
int N;

void dfs(node *&root)//赫尔曼编码
{
    if (root->l) {
        root->l->ma = root->ma + "0";dfs(root->l);
    }
    if (root->r) {
        root->r->ma = root->ma + "1";dfs(root->r);
    }
}

int main()
{
    int cnt = 0;
    cout << "请输入节点的个数" << endl;
    cin >> N;
    resault.resize(2 * N - 1);
    cout<<"请依次输入各节点的名字和权值"<<endl;
    while (N--)
    {
        node tem;
        cin >> tem.data >> tem.w;
        tem.flag = 1;
        all.insert(tem);
    }
    while (all.size() != 1)//选2个最小的到resault中,并创建一个最小合并的节点到all
    {
        node tem;
        auto it2 = all.begin(), it = all.begin();
        it2++;
        resault[cnt++] = *it;
        resault[cnt++] = *it2;
        tem.l = &resault[cnt - 2];tem.r = &resault[cnt - 1];
        tem.data = "(" + tem.l->data + "+" + tem.r->data + ")";
        tem.w = tem.l->w + tem.r->w;
        it2++;
        all.erase(it, it2);
        all.insert(tem);
        /*for (auto x : all)
        cout << x.data << " ";
        cout << endl;*/
    }
    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;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值