王位继承顺序
难度:
标签:
题目描述
代码结果
运行时间: 289 ms, 内存: 63.8 MB
/*
* 思路:
* 1. 与普通Java实现相同,但使用Stream API简化某些操作。
* 2. 使用哈希表来存储家族关系,使用集合来记录死亡人员。
* 3. 在获取继承顺序时,使用Stream过滤死亡人员。
*/
import java.util.*;
import java.util.stream.Collectors;
class ThroneInheritance {
private String king;
private Map<String, List<String>> family;
private Set<String> dead;
public ThroneInheritance(String kingName) {
this.king = kingName;
this.family = new HashMap<>();
this.family.put(kingName, new ArrayList<>());
this.dead = new HashSet<>();
}
public void birth(String parentName, String childName) {
family.computeIfAbsent(parentName, k -> new ArrayList<>()).add(childName);
family.put(childName, new ArrayList<>());
}
public void death(String name) {
dead.add(name);
}
public List<String> getInheritanceOrder() {
List<String> order = new ArrayList<>();
getInheritanceOrderStream(king).forEach(order::add);
return order;
}
private Stream<String> getInheritanceOrderStream(String person) {
return Stream.concat(
dead.contains(person) ? Stream.empty() : Stream.of(person),
family.getOrDefault(person, Collections.emptyList())
.stream()
.flatMap(this::getInheritanceOrderStream)
);
}
}
解释
方法:
该题解采用了树形数据结构来模拟继承关系,使用散列表(hash)存储每个人与其孩子们的关系,以及一个集合(dead)记录死亡人员。当调用birth函数时,孩子会被添加到对应父母的列表中。death函数只将人标记为死亡,不从树中删除。继承顺序是通过先序遍历(preOrder)树来得到的,同时在遍历过程中跳过标记为死亡的人。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在`ThroneInheritance`类中,`birth`函数添加孩子时是否考虑了孩子的出生顺序,以保证继承顺序的正确性?
▷🦆
你提到`death`函数只是将人标记为死亡而不从树中删除,这种设计有什么特定的优势吗?
▷🦆
在`getInheritanceOrder`函数中,先序遍历时跳过了已死亡的人。这种处理方式是否会影响遍历的效率,尤其是当死亡人数很多时?
▷🦆
请问为什么选择使用散列表来存储每个人的孩子,而不是其他数据结构如二叉树或链表?
▷