vector怎么通过更改n个Fibannaci数的代码使得它得出的结果和第一个一样(标签-ios|关键词-stream)

设字符集S,其中8个字符A,B,C,DE,F,G,H的频率是f1,f2,...f8,且100*fi是第i个Fibannaci数的值,i=1,2,3,4,5,6,7,n。给出8个字符的Huffman树和编码,以下是8个字符代码与运行的截图为

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
using namespace std;

// Huffman节点结构体
struct HuffmanNode
{
    int weight; // 权值(频率)
    char c; // 字符
    HuffmanNode *left; // 左子树
    HuffmanNode *right; // 右子树
    HuffmanNode(int w, char ch, HuffmanNode *l, HuffmanNode *r): weight(w), c(ch), left(l), right(r) {}
};

// 用于Huffman节点的小根堆
struct cmp
{
    bool operator() (const HuffmanNode *a, const HuffmanNode *b) const
    {
        return a->weight > b->weight;
    }
};

// 构造Huffman树
HuffmanNode* buildHuffmanTree(const vector<int>& freq, const vector<char>& chars)
{
    priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp> pq;

    int n = freq.size();
    for (int i = 0; i < n; i++)
    {
        HuffmanNode *node = new HuffmanNode(freq[i], chars[i], nullptr, nullptr);
        pq.push(node);
    }

    while (pq.size() > 1)
    {
        HuffmanNode *leftNode = pq.top(); pq.pop();
        HuffmanNode *rightNode = pq.top(); pq.pop();

        HuffmanNode *node = new HuffmanNode(leftNode->weight + rightNode->weight, 0, leftNode, rightNode);
        pq.push(node);
    }

    return pq.top();
}

// 递归遍历Huffman树,生成编码表
void generateCodeTable(HuffmanNode *root, string code, vector<string>& codeTable)
{
    // 叶子节点
    if (!root->left && !root->right)
    {
        codeTable[root->c - 'A'] = code;
        return;
    }

    if (root->left)
        generateCodeTable(root->left, code + '0', codeTable);

    if (root->right)
        generateCodeTable(root->right, code + '1', codeTable);
}

int main()
{
    vector<int> freq = {6765, 4181, 2584, 1597, 987, 610, 377, 233};
    vector<char> chars = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

    HuffmanNode *root = buildHuffmanTree(freq, chars);

    vector<string> codeTable(8, "");
    generateCodeTable(root, "", codeTable);

    // 输出编码表
    for (int i = 0; i < 8; i++)
        cout << chars[i] << ": " << codeTable[i] << endl;

    return 0;
}

运行结果为:

img


经过更改以上代码,得到n个Fibannaci数的huffman树,代码为:


```c++
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
using namespace std;
 
// Fibonacci数列生成函数
int fibonacci(int n)
{
    if (n <= 1)
        return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}
 
// Huffman节点结构体
struct HuffmanNode
{
    int weight; // 权值(频率)
    char c; // 字符
    HuffmanNode* left; // 左子树
    HuffmanNode* right; // 右子树
    HuffmanNode(int w, char ch, HuffmanNode* l, HuffmanNode* r) : weight(w), c(ch), left(l), right(r) {}
};
 
// 用于Huffman节点的小根堆
struct cmp
{
    bool operator()(const HuffmanNode* a, const HuffmanNode* b) const
    {
        return a->weight > b->weight;
    }
};
 
// 构造Huffman树
HuffmanNode* buildHuffmanTree(const vector<int>& freq, const vector<char>& chars)
{
    priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp> pq;
 
    int n = freq.size();
    for (int i = 0; i < n; i++)
    {
        HuffmanNode* node = new HuffmanNode(freq[i], chars[i], nullptr, nullptr);
        pq.push(node);
    }
 
    while (pq.size() > 1)
    {
        HuffmanNode* leftNode = pq.top();
        pq.pop();
        HuffmanNode* rightNode = pq.top();
        pq.pop();
 
        HuffmanNode* node = new HuffmanNode(leftNode->weight + rightNode->weight, 0, leftNode, rightNode);
        pq.push(node);
    }
 
    return pq.top();
}
 
// 递归遍历Huffman树,生成编码表
void generateCodeTable(HuffmanNode* root, string code, vector<string>& codeTable)
{
    // 叶子节点
 
    if (root->left)
        generateCodeTable(root->left, code + '0', codeTable);
 
    if (root->right)
        generateCodeTable(root->right, code + '1', codeTable);
    if (!root->left && !root->right)
    {
        codeTable[root->c - 'A'] = code;
        return;
    }
    
}
 
int main()
{
    int n; // 要生成的Fibonacci数列长度
    cout << "请输入要生成的Fibonacci数列长度: ";
    cin >> n;
 
    vector<int> freq(n, 0);
    vector<char> chars(n, 0);
    for (int i = 0; i < n; i++)
    {
        int fibonacciValue = fibonacci(i + 1);
        freq[i] = fibonacciValue;
        chars[i] = + i+'A';
    }
 
    HuffmanNode* root = buildHuffmanTree(freq, chars);
 
    vector<string> codeTable(n, "");
    generateCodeTable(root, "", codeTable);
 
    // 输出编码表
    for (int i = 0; i < n; i++)
        cout << chars[i]<< ": " << codeTable[i] << endl;
 
    return 0;
}

输出结果却变成了倒三角形,如图所示:

img

怎么通过更改n个Fibannaci数的代码使得它得出的结果和第一个一样,是正三角。


#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
using namespace std;

// Fibonacci数列生成函数
int fibonacci(int n)
{
    if (n <= 1)
        return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

// Huffman节点结构体
struct HuffmanNode
{
    int weight; // 权值(频率)
    char c; // 字符
    HuffmanNode* left; // 左子树
    HuffmanNode* right; // 右子树
    HuffmanNode(int w, char ch, HuffmanNode* l, HuffmanNode* r) : weight(w), c(ch), left(l), right(r) {}
};

// 用于Huffman节点的小根堆
struct cmp
{
    bool operator()(const HuffmanNode* a, const HuffmanNode* b) const
    {
        return a->weight > b->weight;
    }
};

// 构造Huffman树
HuffmanNode* buildHuffmanTree(const vector<int>& freq, const vector<char>& chars)
{
    priority_queue<HuffmanNode*, vector<HuffmanNode*>, cmp> pq;

    int n = freq.size();
    for (int i = 0; i < n; i++)
    {
        HuffmanNode* node = new HuffmanNode(freq[i], chars[i], nullptr, nullptr);
        pq.push(node);
    }

    while (pq.size() > 1)
    {
        HuffmanNode* leftNode = pq.top();
        pq.pop();
        HuffmanNode* rightNode = pq.top();
        pq.pop();

        HuffmanNode* node = new HuffmanNode(leftNode->weight + rightNode->weight, 0, leftNode, rightNode);
        pq.push(node);
    }

    return pq.top();
}

// 递归遍历Huffman树,生成编码表
void generateCodeTable(HuffmanNode* root, string code, vector<string>& codeTable)
{
    // 叶子节点
    if (!root->left && !root->right)
    {
        codeTable[root->c - 'A'] = code;
        return;
    }

    if (root->left)
        generateCodeTable(root->left, code + '0', codeTable);

    if (root->right)
        generateCodeTable(root->right, code + '1', codeTable);
}

int main()
{
    int n; // 要生成的Fibonacci数列长度
    cout << "请输入要生成的Fibonacci数列长度: ";
    cin >> n;

    vector<int> freq(n, 0);
    vector<char> chars(n, 0);
    for (int i = 0; i < n; i++)
    {
        int fibonacciValue = fibonacci(i);
        freq[i] = fibonacciValue;
        chars[i] = 'A' + i;
    }

    HuffmanNode* root = buildHuffmanTree(freq, chars);

    vector<string> codeTable(n, "");
    generateCodeTable(root, "", codeTable);

    // 输出编码表
    for (int i = 0; i < n; i++)
        cout << chars[i] << ": " << codeTable[i] << endl;

    return 0;
}