PTA 7-9(树) 目录树(30 分) 30分代码 建树+输出

博客内容讲述了如何处理PTA中的树形问题,通过建立树的结构体节点,并利用vector存储子树节点来构建目录树。重点在于理解输入格式,按照题目给定的顺序输出目录和文件。提供了AC代码用于解决这个问题。

赤裸裸的建树然后输出

需要注意的是 输出的顺序:

先输出目录,在输出文件,,但这个划分使他题目给定的,而不是后面没有子文件来判定目录

这样在输入的时候处理好就是了


方法就是 利用结构体node 做一棵树的根结点,,vec 里面存他的子树结点(也就是另一棵树的根结点)

(注: 博客作为交流使用,请勿抄袭应付作业)


下面是 AC 代码:


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 500+7, INF = 0x7f7f7f7f;

int n, cur;
string s, t, a[maxn];
int b[maxn];

struct node {
    string name;
    int f;
    vector<node> vec;
    node() {}
    node(string s, int f_) { name = s; f = f_; /*cout << " 2333 " << endl;*/ }
    bool operator < (const node n2) const {
        if(f == n2.f) return name < n2.name;
        return f > n2.f;
    }
}root;


void add(node& no, int pos, int cnt) {
    if(pos == cnt) return;
    int i
虽然给定引用中未直接涉及PTA 7 - 3题目构造哈夫曼的内容,但可依据引用[1]中的代码框架来构建解题思路与代码实现。 ### 解题思路 1. **哈夫曼节点定义**:定义哈夫曼节点结构体,包含权值、父节点、左子节点和右子节点信息。 2. **选择两个最小权值节点**:编写`SelectTwoMin`函数,在未处理的节点中选择两个权值最小且无父节点的节点。 3. **构建哈夫曼**:依据给定的权值数组,不断选择两个最小权值节点合并成新节点,直至构建出完整的哈夫曼。 4. **生成哈夫曼编码**:从叶子节点开始,逆向追溯到根节点,生成每个叶子节点的哈夫曼编码。 ### 代码实现 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int weight; int parent; int lchild; int rchild; } HTNode, *HuffmanTree; typedef char ** HuffmanCode; // 选择两个最小权值的节点 void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2) { int min1 = 0x3f3f3f3f, min2 = 0x3f3f3f3f; for (int i = 1; i <= upbound; ++i) { if (HT[i].parent == 0) { if (HT[i].weight < min1) { min2 = min1; s2 = s1; min1 = HT[i].weight; s1 = i; } else if (HT[i].weight < min2) { min2 = HT[i].weight; s2 = i; } } } } // 哈夫曼编码 void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) { int m = 2 * n - 1; HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode)); for (int i = 1; i <= n; ++i) { HT[i].weight = w[i - 1]; HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; } for (int i = n + 1; i <= m; ++i) { HT[i].weight = 0; HT[i].parent = 0; HT[i].lchild = 0; HT[i].rchild = 0; } for (int i = n + 1; i <= m; ++i) { int s1, s2; SelectTwoMin(i - 1, HT, s1, s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; } HC = (HuffmanCode)malloc((n + 1) * sizeof(char *)); char *cd = (char *)malloc(n * sizeof(char)); cd[n - 1] = &#39;\0&#39;; for (int i = 1; i <= n; ++i) { int start = n - 1; int c = i; int f = HT[i].parent; while (f != 0) { --start; if (HT[f].lchild == c) cd[start] = &#39;0&#39;; else cd[start] = &#39;1&#39;; c = f; f = HT[f].parent; } HC[i] = (char *)malloc((n - start) * sizeof(char)); strcpy(HC[i], &cd[start]); } free(cd); } int main() { HuffmanTree ht; HuffmanCode hc; int n; scanf("%d", &n); int *w = (int *) malloc (n * sizeof(int)); for(int i = 0; i < n; ++ i) scanf("%d", &w[i]); HuffmanCoding(ht, hc, w, n); for (int i = 1; i <= 2 * n - 1; ++ i) { printf("%d %d %d %d\n", ht[i].weight, ht[i].parent, ht[i].lchild, ht[i].rchild); } for (int i = 1; i <= n; ++ i) printf("%s\n", hc[i]); free(w); free(ht); for (int i = 1; i <= n; ++ i) free(hc[i]); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值