Design an employee-manager system with exactly one CEO. The CEO has no manager. Every other employee has exactly one direct manager.
The system must support adding employees, getting an employee's manager, changing an employee's manager, and checking whether an employee works directly or indirectly under a manager.
class EmployeeManagerSystem
EmployeeManagerSystem(String ceoId)
ceoId will not be an empty string.boolean addEmployee(String managerId, String employeeId)
employeeId under an existing managerId.true if the employee is added.false if employeeId already exists or managerId does not exist.false is returned, do nothing.String getManager(String employeeId)
employeeId.employeeId is the CEO or does not exist.boolean changeManager(String employeeId, String oldManagerId, String newManagerId)
employeeId from oldManagerId to an existing newManagerId.true if the change is successful.false if any ID is invalid, employeeId is the CEO, oldManagerId is not the current manager, or the change creates a cycle.false is returned, do nothing.boolean worksFor(String managerId, String employeeId)
true if both IDs exist and employeeId works directly or indirectly under managerId.false if either ID does not exist or both IDs are the same.managerId and employeeId in input will always be different.getManager: O(1)addEmployee: O(1) average timechangeManager: O(h) because cycle checking may walk a manager chainworksFor: O(h), where h is the height of the manager chainO(1) average time.1 ≤ number of method calls ≤ 100,0001 ≤ employeeId.length, managerId.length ≤ 100EmployeeManagerSystem system = new EmployeeManagerSystem(ceoId = "CEO")
system.getManager(employeeId = "CEO")
Output: ""
EmployeeManagerSystem system = new EmployeeManagerSystem(ceoId = "CEO")
system.addEmployee(managerId = "CEO", employeeId = "Asha")
Output: true
system.addEmployee(managerId = "Asha", employeeId = "Ravi")
Output: true
system.getManager(employeeId = "Ravi")
Output: "Asha"
system.worksFor(managerId = "CEO", employeeId = "Ravi")
Output: true
EmployeeManagerSystem system = new EmployeeManagerSystem(ceoId = "CEO")
system.addEmployee(managerId = "CEO", employeeId = "Meera")
Output: true
system.addEmployee(managerId = "CEO", employeeId = "Meera")
Output: false
system.getManager(employeeId = "Meera")
Output: "CEO"
EmployeeManagerSystem system = new EmployeeManagerSystem(ceoId = "CEO")
system.addEmployee(managerId = "CEO", employeeId = "Tara")
Output: true
system.addEmployee(managerId = "CEO", employeeId = "Vikram")
Output: true
system.changeManager(employeeId = "Tara", oldManagerId = "CEO", newManagerId = "Vikram")
Output: true
system.worksFor(managerId = "Vikram", employeeId = "Tara")
Output: true