从一个文本来创建一颗树

LeetCode树结构生成器

在做跟树有关的题目的时候,当然是leetcode上面的题目,我发现leetcode上面的树是这样表示的:{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7},于是为了便于测试,我可以直接利用这个文本文件来生成一个树,这样生成树的工作就变得非常简单了。代码如下:

typedef struct TreeNode{
    int value;
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode,*Tree;

void constructtree(Tree *T , char filepath[])
{
    FILE *f;
    f=fopen(filepath,"r");
    char line[256];
    Tree tarray[256];
    memset(tarray,NULL,sizeof(Tree)*256);
    fgets(line,256,f);
    cout<<line<<endl;
    char numstr[12];
    int nump=0,k=0;
    for(int i=1 ; i<256 && line[i]!='\0'; i++){
        if(line[i]==',' || line[i]=='}'){
            numstr[nump]='\0';
            if(numstr[nump-1]=='#'){
                tarray[k]=NULL;
                k++;
            }
            else{
                TreeNode *tp=(Tree)malloc(sizeof(TreeNode));            
                tp->value=atoi(numstr);
                tarray[k]=tp;
                k++;
            }
            nump=0;
        }
        else{
            numstr[nump]=line[i];
            nump++;
        }
    }
    int root,child;
    root=0,child=1;
    for(;root<k;root++){
        if(tarray[root]==NULL)
            continue;
        tarray[root]->left=tarray[child];
        child++;
        tarray[root]->right=tarray[child];
        child++;
    }
    *T=tarray[0];
    fclose(f);
}


创建一棵Huffman并输出其字母的Huffman编码,可以按照以下步骤进行: 1. 统计每个字母在文本中出现的频率。 2. 根据频率构建一个最小堆(或优先队列),将每个字母作为一个节点插入堆中,节点的权重为对应字母的频率。 3. 从堆中取出两个权重最小的节点,合并它们成为一个新的节点,新节点的权重为两个子节点的权重之和。将新节点插入堆中。 4. 重复步骤3,直到堆中只剩下一个节点,这个节点就是Huffman的根节点。 5. 遍历Huffman,给每个字母分配一个唯一的Huffman编码。从根节点开始,向左走为0,向右走为1,直到叶子节点。记录下每个字母对应的编码。 6. 输出每个字母及其对应的Huffman编码。 下面是一个示例代码: ```cpp #include <iostream> #include <queue> #include <unordered_map> using namespace std; // Huffman节点 struct Node { char data; // 字母 int freq; // 频率 Node* left; Node* right; Node(char data, int freq) : data(data), freq(freq), left(nullptr), right(nullptr) {} }; // 用于比较节点频率的函数对象 struct Compare { bool operator()(Node* a, Node* b) { return a->freq > b->freq; } }; // 构建Huffman Node* buildHuffmanTree(const unordered_map<char, int>& freqMap) { priority_queue<Node*, vector<Node*>, Compare> minHeap; for (const auto& pair : freqMap) { minHeap.push(new Node(pair.first, pair.second)); } while (minHeap.size() > 1) { Node* left = minHeap.top(); minHeap.pop(); Node* right = minHeap.top(); minHeap.pop(); Node* parent = new Node('\0', left->freq + right->freq); parent->left = left; parent->right = right; minHeap.push(parent); } return minHeap.top(); } // 递归遍历Huffman,生成编码 void generateHuffmanCode(Node* root, string code, unordered_map<char, string>& huffmanCodeMap) { if (root == nullptr) { return; } if (root->left == nullptr && root->right == nullptr) { huffmanCodeMap[root->data] = code; } generateHuffmanCode(root->left, code + "0", huffmanCodeMap); generateHuffmanCode(root->right, code + "1", huffmanCodeMap); } // 输出Huffman编码 void printHuffmanCode(const unordered_map<char, string>& huffmanCodeMap) { for (const auto& pair : huffmanCodeMap) { cout << pair.first << ": " << pair.second << endl; } } int main() { string text = "hello world"; unordered_map<char, int> freqMap; for (char c : text) { freqMap[c]++; } Node* root = buildHuffmanTree(freqMap); unordered_map<char, string> huffmanCodeMap; generateHuffmanCode(root, "", huffmanCodeMap); printHuffmanCode(huffmanCodeMap); return 0; } ``` 这段代码会输出每个字母及其对应的Huffman编码。在这个示例中,输入的文本是"hello world",输出结果如下: ``` h: 00 e: 10 l: 110 o: 111 w: 0100 r: 0101 d: 011 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值