LeetCode in Kotlin

1600. Throne Inheritance

Medium

A kingdom consists of a king, his children, his grandchildren, and so on. Every once in a while, someone in the family dies or a child is born.

The kingdom has a well-defined order of inheritance that consists of the king as the first member. Let’s define the recursive function Successor(x, curOrder), which given a person x and the inheritance order so far, returns who should be the next person after x in the order of inheritance.

Successor(x, curOrder): if x has no children or all of x’s children are in curOrder: if x is the king return null else return Successor(x’s parent, curOrder) else return x’s oldest child who’s not in curOrder

For example, assume we have a kingdom that consists of the king, his children Alice and Bob (Alice is older than Bob), and finally Alice’s son Jack.

  1. In the beginning, curOrder will be ["king"].
  2. Calling Successor(king, curOrder) will return Alice, so we append to curOrder to get ["king", "Alice"].
  3. Calling Successor(Alice, curOrder) will return Jack, so we append to curOrder to get ["king", "Alice", "Jack"].
  4. Calling Successor(Jack, curOrder) will return Bob, so we append to curOrder to get ["king", "Alice", "Jack", "Bob"].
  5. Calling Successor(Bob, curOrder) will return null. Thus the order of inheritance will be ["king", "Alice", "Jack", "Bob"].

Using the above function, we can always obtain a unique order of inheritance.

Implement the ThroneInheritance class:

Example 1:

Input

[“ThroneInheritance”, “birth”, “birth”, “birth”, “birth”, “birth”, “birth”, “getInheritanceOrder”, “death”, “getInheritanceOrder”]

[[“king”], [“king”, “andy”], [“king”, “bob”], [“king”, “catherine”], [“andy”, “matthew”], [“bob”, “alex”], [“bob”, “asha”], [null], [“bob”], [null]]

Output: [null, null, null, null, null, null, null, [“king”, “andy”, “matthew”, “bob”, “alex”, “asha”, “catherine”], null, [“king”, “andy”, “matthew”, “alex”, “asha”, “catherine”]]

Explanation:

ThroneInheritance t= new ThroneInheritance(“king”); // order: king

t.birth(“king”, “andy”); // order: king > andy

t.birth(“king”, “bob”); // order: king > andy > bob

t.birth(“king”, “catherine”); // order: king > andy > bob > catherine

t.birth(“andy”, “matthew”); // order: king > andy > matthew > bob > catherine

t.birth(“bob”, “alex”); // order: king > andy > matthew > bob > alex > catherine

t.birth(“bob”, “asha”); // order: king > andy > matthew > bob > alex > asha > catherine

t.getInheritanceOrder(); // return [“king”, “andy”, “matthew”, “bob”, “alex”, “asha”, “catherine”]

t.death(“bob”); // order: king > andy > matthew > bob > alex > asha > catherine t.getInheritanceOrder(); // return [“king”, “andy”, “matthew”, “alex”, “asha”, “catherine”]

Constraints:

Solution

class ThroneInheritance(private val king: String) {
    private val graph: HashMap<String, LinkedHashSet<String>>
    private val isDead: HashSet<String>

    init {
        graph = HashMap()
        isDead = HashSet()
        graph[king] = LinkedHashSet()
    }

    fun birth(parentName: String, childName: String) {
        graph.putIfAbsent(parentName, LinkedHashSet())
        graph[parentName]!!.add(childName)
    }

    fun death(name: String) {
        isDead.add(name)
    }

    fun getInheritanceOrder(): List<String> {
        val inheritance: MutableList<String> = ArrayList()
        val visited = HashSet<String>()
        dfs(graph, king, inheritance, visited)
        return inheritance
    }

    fun dfs(
        graph: Map<String, LinkedHashSet<String>>,
        src: String,
        l: MutableList<String>,
        visited: MutableSet<String>,
    ) {
        visited.add(src)
        if (!isDead.contains(src)) {
            l.add(src)
        }
        if (!graph.containsKey(src)) {
            return
        }
        for (s in graph[src]!!) {
            if (!visited.contains(s)) {
                dfs(graph, s, l, visited)
            }
        }
    }
}
/*
 * Your ThroneInheritance object will be instantiated and called as such:
 * var obj = ThroneInheritance(kingName)
 * obj.birth(parentName,childName)
 * obj.death(name)
 * var param_3 = obj.getInheritanceOrder()
 */
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy