Skip to content

Instantly share code, notes, and snippets.

@granmoe
Created January 24, 2020 17:14
Show Gist options
  • Select an option

  • Save granmoe/43f4eaf74f1c861d3df7b9371e5ceefa to your computer and use it in GitHub Desktop.

Select an option

Save granmoe/43f4eaf74f1c861d3df7b9371e5ceefa to your computer and use it in GitHub Desktop.

Revisions

  1. granmoe created this gist Jan 24, 2020.
    46 changes: 46 additions & 0 deletions answer.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    /**
    * Given an array of Person objects, returns the root PersonTreeNode (the CEO).
    * @param {Person[]} employees - An array of Person objects representing all the employees of the company.
    * @returns {PersonTreeNode} The CEO of the organization.
    */
    function generateTree(employees) {
    let ceo = null

    const visitedById = new Map()
    const visitedByManagerId = new Map()

    for (const employee of employees) {
    const node = new PersonTreeNode(employee)
    visitedById.set(employee.id, node)

    // Add any direct reports we've already visited for this manager
    const visitedDirectReports = visitedByManagerId.get(employee.id)
    if (Array.isArray(visitedDirectReports)) {
    node.directReports.push(...visitedDirectReports)
    }

    // Check if this is the CEO and skip the remaining logic in the loop if so
    if (employee.manager === null) {
    ceo = node
    continue
    }

    const managerNode = visitedById.get(employee.manager.id)
    if (managerNode) {
    // Add our node to its manager's direct reports (if manager visited)
    managerNode.directReports.push(node)
    } else {
    // Otherwise add node to map to be added to the manager's direct reports once we visit the manager
    const visitedDirectReportsForManager = visitedByManagerId.get(
    employee.manager.id,
    )
    if (Array.isArray(visitedDirectReportsForManager)) {
    visitedDirectReportsForManager.push(node)
    } else {
    visitedByManagerId.set(employee.manager.id, [node])
    }
    }
    }

    return ceo
    }