题目地址:
https://www.lintcode.com/problem/print-organization-chart/description
给定一个列表,每个元素是个字符串列表,每个列表代表一个员工,按照该员工姓名,上级姓名,职位和年份排列。上级为”NULL“代表该员工是最高层的员工,没有上级。题目保证公司员工按照上下级关系的结构是个树结构。要求返回一个列表,列表里含的是字符串,格式是其姓名、空格、左括号、职位、右括号、空格、年份,字符串之间的顺序是先序遍历整棵树。并且该树的同一层的员工按照姓名的字典序排序。
思路是DFS。先建立树结构,再进行DFS。这里建立树结构的时候,最好将每个员工包装成一个类,将其姓名、下级、职位和年份包装在类里。代码如下:
import java.util.*;
public class Solution {
class Person implements Comparable<Person> {
String name, pos, year;
Set<Person> sub;
public Person(String name) {
this.name = name;
// sub用TreeSet,保证下级按照字典序排序
sub = new TreeSet<>();
}
@Override
public int compareTo(Person p) {
return name.compareTo(p.name);
}
}
/**
* @param relationship: the relationship
* @return: the organization chart
*/
public List<String> getOrganization(List<List<String>> relationship) {
// Write your code here
List<String> res = new ArrayList<>();
Person root = buildTree(relationship);
dfs(root, 0, res);
return res;
}
private void dfs(Person cur, int level, List<String> res) {
StringBuilder sb = new StringBuilder();
sb.append("-".repeat(level)).append(cur.name).append(" (").append(cur.pos).append(") ").append(cur.year);
res.add(sb.toString());
for (Person sub : cur.sub) {
dfs(sub, level + 1, res);
}
}
private Person buildTree(List<List<String>> relationship) {
// 建立员工名和员工Person对象之间的映射关系
Map<String, Person> map = new HashMap<>();
// 存树根对应的Person
Person root = null;
for (List<String> relation : relationship) {
String nameSub = relation.get(0), nameSup = relation.get(1);
if ("NULL".equals(nameSup)) {
root = map.getOrDefault(nameSub, new Person(relation.get(0)));
root.pos = relation.get(2);
root.year = relation.get(3);
map.put(root.name, root);
continue;
}
Person personSub = map.getOrDefault(nameSub, new Person(relation.get(0)));
map.putIfAbsent(nameSub, personSub);
personSub.pos = relation.get(2);
personSub.year = relation.get(3);
Person personSup = map.getOrDefault(nameSup, new Person(relation.get(1)));
map.putIfAbsent(nameSup, personSup);
personSup.sub.add(personSub);
}
return root;
}
}
时空复杂度 O ( n l ) O(nl) O(nl), l l l代表每个Person对应的字符串长度。