一、题目

一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点,这个家庭里有人出生也有人死亡。

这个王国有一个明确规定的皇位继承顺序,第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) ,给定一个人 x 和当前的继承顺序,该函数返回 x 的下一继承人。

Successor(x, curOrder): 如果 x 没有孩子或者所有 x 的孩子都在 curOrder 中: 如果 x 是国王,那么返回 null 否则,返回 Successor(x 的父亲, curOrder) 否则,返回 x 不在 curOrder 中最年长的孩子

比方说,假设王国由国王,他的孩子 Alice 和 Bob (Alice 比 Bob 年长)和 Alice 的孩子 Jack 组成。

  1. 1. 一开始, curOrder ["king"].
  2. 1. 调用 Successor(king, curOrder) ,返回 Alice ,所以我们将 Alice 放入 curOrder 中,得到 ["king", "Alice"]
  3. 1. 调用 Successor(Alice, curOrder) ,返回 Jack ,所以我们将 Jack 放入 curOrder 中,得到 ["king", "Alice", "Jack"]
  4. 1. 调用 Successor(Jack, curOrder) ,返回 Bob ,所以我们将 Bob 放入 curOrder 中,得到 ["king", "Alice", "Jack", "Bob"]
  5. 1. 调用 Successor(Bob, curOrder) ,返回 null 。最终得到继承顺序为 ["king", "Alice", "Jack", "Bob"]

通过以上的函数,我们总是能得到一个唯一的继承顺序。

请你实现 ThroneInheritance 类:

  • ThroneInheritance(string kingName) 初始化一个 ThroneInheritance 类的对象。国王的名字作为构造函数的参数传入。
  • void birth(string parentName, string childName) 表示 parentName 新拥有了一个名为 childName 的孩子。
  • void death(string name) 表示名为 name 的人死亡。一个人的死亡不会影响 Successor 函数,也不会影响当前的继承顺序。你可以只将这个人标记为死亡状态。
  • string[] getInheritanceOrder() 返回 除去 死亡人员的当前继承顺序列表。

点击查看原题
难度级别:中等

二、思路

1)多叉树前序遍历

理解题目比较困难
根据题意生成多叉树,同一父母的孩子在同一个List中,death的节点使用一个HashSet进行标记,遍历的时候不添加进结果里面

三、代码

1)多叉树前序遍历

  1. class ThroneInheritance {
  2. private Map<String, List<String>> map;
  3. private Set<String> deathSet;
  4. private String kingName;
  5. public ThroneInheritance(String kingName) {
  6. map = new HashMap();
  7. deathSet = new HashSet();
  8. this.kingName = kingName;
  9. }
  10. public void birth(String parentName, String childName) {
  11. if (!map.containsKey(parentName)) {
  12. map.put(parentName, new ArrayList<String>());
  13. }
  14. map.get(parentName).add(childName);
  15. }
  16. public void death(String name) {
  17. deathSet.add(name);
  18. }
  19. public List<String> getInheritanceOrder() {
  20. List<String> ans = new ArrayList();
  21. dfs(ans, kingName);
  22. return ans;
  23. }
  24. private void dfs(List<String> ans, String parentName) {
  25. if (!deathSet.contains(parentName)) {
  26. ans.add(parentName);
  27. }
  28. if (map.containsKey(parentName)) {
  29. List<String> childs = map.get(parentName);
  30. for (String child : childs) {
  31. dfs(ans, child);
  32. }
  33. }
  34. }
  35. }

时间复杂度为O(n),空间复杂度为O(n)