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;
}