7-1 目录树

7-1 目录树
分数 25
作者 DS课程组
单位 浙江大学
在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。

输入格式:
输入首先给出正整数N(≤10*4 ),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):

路径和名称中的字符仅包括英文字母(区分大小写);
符号“\”仅作为路径分隔符出现;
目录以符号“\”结束;
不存在重复的输入项目;
整个输入大小不超过2MB。
输出格式:
假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。

输入样例:

7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\

输出样例:

root
  a
    d
      z
      a
    bc
  ab
    cd
    d
  c
  b

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解题代码:

#include <bits/stdc++.h>
using namespace std;
class TreeNode
{
public:
    string name;
    TreeNode *child, *sibling;
    int priority;
};
TreeNode *CreateNode(string nam, int pri)
{
    TreeNode *T;
    T = new TreeNode;
    T->name = nam;
    T->priority = pri;
    T->child = T->sibling = NULL;
    return T;
}
TreeNode *Insert(TreeNode *T, string nam, int pri)
{
    if (T->child == NULL)
    {
        T->child = CreateNode(nam, pri);
        return T->child;
    }
    TreeNode *tmp = T->child, *father = T;
    while (tmp != NULL && ((pri < tmp->priority) || (tmp->priority == pri && nam > tmp->name)))
    {
        father = tmp;
        tmp = tmp->sibling;
    }
    if (tmp == NULL)
    {
        TreeNode *N = CreateNode(nam, pri);
        N->sibling = father->sibling;
        father->sibling = N;
        return N;
    }
    if (tmp->priority == pri && nam == tmp->name)
        return tmp;
    else
    {
        TreeNode *N = CreateNode(nam, pri);
        if (father->name == T->name)
        {
            N->sibling = father->child;
            father->child = N;
        }
        else
        {
            N->sibling = father->sibling;
            father->sibling = N;
        }
        return N;
    }
}
void Preoder(TreeNode *T, int layer)
{
    if (T == NULL)
        return;
    int cl, sl;
    for (int i = 0; i < layer; i++)
        cout << "  ";
    cl = layer + 1;
    sl = layer;
    cout << T->name << endl;
    Preoder(T->child, cl);
    Preoder(T->sibling, sl);
}
int main()
{
    int n, bgn, end, i, j;
    string s;
    TreeNode *root = CreateNode("root", 1);
    TreeNode *pos;
    scanf("%d\n", &n);
    for (i = 0; i < n; i++)
    {
        getline(cin, s);
        pos = root;
        bgn = end = 0;
        for (j = 0; j < s.length(); j++)
        {
            if (s[j] == '\\')
            {
                end = j;
                pos = Insert(pos, s.substr(bgn, end - bgn), 1);
                bgn = end + 1;
            }
        }
        if (s[bgn] != '\0')
        {
            Insert(pos, s.substr(bgn, s.length() - bgn), 0);
        }
    }
    Preoder(root, 0);
    return 0;
}
posted @ 2022-10-14 00:11  Linkway  阅读(129)  评论(0)    收藏  举报