题目描述:
给你一串路径,譬如:
a\b\c
a\d\e
b\cst
d\
你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样:
a
b
c
d
e
b
cst
d
同一级的需要按字母顺序排列,不能乱。
输入:
每个测试案例第一行为一个正整数n(n<=10)表示有n个路径,当n为0时,测试结束,接下来有n行,每行有一个字串表示一个路径,长度小于50。
输出:
输出目录结构,每一个测试样例的输出紧跟一个空行。
样例输入:
4
a\b\c
a\d\e
b\cst
d\
0
样例输出:
a
b
c
d
e
b
cst
d
我在这里是是建了一个多叉树。兄弟节点之间是排序的。
自定义一个跟节点。每个节点都一个前缀(subString),代表他们的路径,如果相同,则是同一个目录。
是用Java的TreeSet可以自动排序。
解释在代码注释里了。
网上也有用字典树的。还有一种简单的方法是a/b/c, 可以看成是文件 a,a/b,a/b/c 这样把所有的文件按照自定义规则排序,在输出就行了。
public class PathPrint_1090 {
static int n;
static Node root; //定义一个根节点
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
n = scanner.nextInt();
if(n == 0)
break;
String str;
Node root = new Node();
root.key = "";
root.subString = "";
root.children = new TreeSet<Node>();
for (int i = 0; i < n; i++) {
str = scanner.next();
root.addChild(new Node(str.split("\\\\"), 0, root)); //将读入的一个字符串分割为一个字符数组,构造一个链表
}
root.print();
System.out.println();
}
}
}
class Node implements Comparable<Node> {
public String key; //需要输出的名称
public String subString; //前缀,相同则为一个目录
public TreeSet<Node> children; //子节点。个数不定
public Node father; //父节点
public int pre; //代表偏移量
public int compareTo(Node o) { //定义比较函数。即比较前缀 a\b\ == a\b\, 是一个目录
return this.subString.compareTo(o.subString);
}
public Node() {}
//根据一个字符数组,构造一个节点串.
public Node(String str[], int index, Node f) {
this.subString = "";
if (index == str.length) //到了最后就直接返回
return;
for (int i = 1; i <= index; i++)
this.subString += str[i] + '\\'; //获得前缀
if (index == 0)
this.subString = str[0];
this.key = str[index];
this.pre = f.pre + f.key.length() + 1; //偏移量等于父节点的偏移量 + 父节点长度
this.father = f;
if (index != str.length) {
if (this.children == null)
this.children = new TreeSet<Node>();
children.add(new Node(str, index + 1, this));
}
}
public void addChild(Node n) { //添加一个孩子节点
//由于孩子节点可能重复,重新合并
if (children.contains(n)) {
Node temp = null;
for (Node temp2 : children) {
if (temp2.compareTo(n) == 0)
temp = temp2;
}
temp.addChild(n.children.first());
} else {
children.add(n);
}
}
public void print() {
if (this.key == null)
return;
if(this.key != ""){
pre--; //由于第一个位置会多个空格
while (pre-- > 0)
System.out.print(" ");
System.out.println(key);
}
if (this.children != null && children.size() > 0) {
for (Node n : children)
n.print();
}
}
}
分享到:
相关推荐
吉林省2010的数学建模题题目A:学科评价模型题目 B:出租车交接班模型
1、树的统计 ...第一行:n:结点数量;k:边数;(n,k) 以下k行:每行两个结点编号:i,j:i是j的父结点(I,j)。 输出: 第一行:树的数量。 第二行:依次输出森林中树的根结点编号(从小到大)。 样例输入:
第一届“中国软件杯”大学生软件设计大赛比赛题目四:基于Web的3D智能虚拟人.docx第一届“中国软件杯”大学生软件设计大赛比赛题目四:基于Web的3D智能虚拟人.docx第一届“中国软件杯”大学生软件设计大赛比赛题目四...
实验报告,内含设计思想、实验代码及注释、验证与结论、总结...实验题目1:数列前n项和 实验题目2:寻找双质数 实验题目3:寻找回文数 实验题目4:储蓄账户余额计算器 实验题目5:求解勒让德多项式 实验题目6:闰年问题
0589. N 叉树的前序遍历标签:栈、树、深度优先搜索难度:简单题目大意给定一棵 N 叉树的根节点 root。逆序遍历栈顶节点的子节点,将其依次放入栈中(逆序
数据结构-实验三-题目二:哈夫曼树.docx
这是九度OJ-题目1509:树中两个结点的最低公共祖先的测试数据,input.txt是输入数据,output.txt是输出数据。
2018强网杯CTF___题目整理 │ ├── 01Misc-4题 │ ├── 题目名称:ai-nimals │ │ └── 题目名称:ai-nimals.mhtml │ ├── 题目名称:welcome │ │ └── 题目名称:welcome.mhtml │ ├── 题目名称:...
大学生数学建模:个人小论文题目:最佳组队题目.pdf大学生数学建模:个人小论文题目:最佳组队题目.pdf大学生数学建模:个人小论文题目:最佳组队题目.pdf大学生数学建模:个人小论文题目:最佳组队题目.pdf大学生...
大学生数学建模:个人小论文题目:最佳组队题目.docx大学生数学建模:个人小论文题目:最佳组队题目.docx大学生数学建模:个人小论文题目:最佳组队题目.docx大学生数学建模:个人小论文题目:最佳组队题目.docx大学...
实验题目1:数组元素遍历 实验题目2:数组合并与排序 实验题目3:填充矩阵 实验题目4:字串处理 实验题目5:寻找子串 实验六:指针 实验题目1:函数指针应用 实验题目2:指针作为函数参数 实验题目3:单词排序 实验...
打印三角形图案 编一程序显示由符号组成的三角形图案。例如,程序运行后, 屏幕显示:How many lines? 用户输入:5 屏幕显示:What character? 用户输入:* 则输出如下图案 * *** ***** ******* ********* ...
比赛题目六:物流配送中的最优路径规划模拟软件 比赛题目七:大数据环境下集成R语 宇龙酷派赛题一:基于Android平台的安全通信录 宇龙酷派赛题二:基于Android平台的超级记事本软件 宇龙酷派赛题三:基于Android...
毕设题目:关于HEVC帧间预测测试AMP模式的快速算法 毕设题目:关于HEVC帧间预测测试AMP模式的快速算法 毕设题目:关于HEVC帧间预测测试AMP模式的快速算法 毕设题目:关于HEVC帧间预测测试AMP模式的快速算法 毕设题目...
题目一:人事管理系统 1、系统功能的基本要求: (1)员工各种信息的输入,包括员工的基本信息、学历信息、婚姻状况信息、职称等。 (2)员工各种信息的修改; (3)对于转出、辞职、辞退、退休员工信息的删除; ...
题目描述:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵 题目示例:三阶方阵,围绕方阵中心顺时针旋转 输入描述: (1) 第一行输入一个正整数N (0<N<10) (2) 接下来...
题目19:基于MATLAB的电力系统复杂潮流计算.docx题目19:基于MATLAB的电力系统复杂潮流计算.docx
实验题目18:WINS服务器的配置和管理