Throne Inheritance

medium tree dfs design

Problem

A kingdom is a family tree rooted at the king: each person has an ordered list of children. Births and deaths happen over time. getInheritanceOrder() returns the current order of inheritance — a pre-order walk from the king (visit a person, then recurse into their children oldest-first) — while skipping anyone who has died.

Inputking with children andy, bob, catherine; andy→matthew; bob→alex, asha; death(bob)
Output["king","andy","matthew","alex","asha","catherine"]
Pre-order visits king, andy, matthew, bob, alex, asha, catherine; bob is dead, so it is dropped.

class ThroneInheritance:
    def __init__(self, king):
        self.king = king
        self.children = {}
        self.dead = set()

    def birth(self, parent, child):
        self.children.setdefault(parent, []).append(child)

    def death(self, name):
        self.dead.add(name)

    def getInheritanceOrder(self):
        order = []
        def dfs(name):
            if name not in self.dead:
                order.append(name)
            for child in self.children.get(name, []):
                dfs(child)
        dfs(self.king)
        return order
class ThroneInheritance {
  constructor(king) {
    this.king = king;
    this.children = new Map();
    this.dead = new Set();
  }
  birth(parent, child) {
    if (!this.children.has(parent)) this.children.set(parent, []);
    this.children.get(parent).push(child);
  }
  death(name) {
    this.dead.add(name);
  }
  getInheritanceOrder() {
    const order = [];
    const dfs = (name) => {
      if (!this.dead.has(name)) order.push(name);
      for (const child of (this.children.get(name) || [])) dfs(child);
    };
    dfs(this.king);
    return order;
  }
}
class ThroneInheritance {
    String king;
    Map<String, List<String>> children = new HashMap<>();
    Set<String> dead = new HashSet<>();
    public ThroneInheritance(String king) { this.king = king; }
    public void birth(String parent, String child) {
        children.computeIfAbsent(parent, k -> new ArrayList<>()).add(child);
    }
    public void death(String name) { dead.add(name); }
    public List<String> getInheritanceOrder() {
        List<String> order = new ArrayList<>();
        dfs(king, order);
        return order;
    }
    private void dfs(String name, List<String> order) {
        if (!dead.contains(name)) order.add(name);
        for (String child : children.getOrDefault(name, List.of())) dfs(child, order);
    }
}
class ThroneInheritance {
    string king;
    unordered_map<string, vector<string>> children;
    unordered_set<string> dead;
    void dfs(const string& name, vector<string>& order) {
        if (!dead.count(name)) order.push_back(name);
        for (auto& child : children[name]) dfs(child, order);
    }
public:
    ThroneInheritance(string kingName) : king(kingName) {}
    void birth(string parent, string child) { children[parent].push_back(child); }
    void death(string name) { dead.insert(name); }
    vector<string> getInheritanceOrder() {
        vector<string> order;
        dfs(king, order);
        return order;
    }
};
Time: O(n) per getInheritanceOrder Space: O(n)