Restore the Array From Adjacent Pairs

MediumArrayHash TableDepth-First Search

Solution

class Graph {
  private readonly graph: Map<number, number[]>;
  constructor() {
    this.graph = new Map();
  }
 
  get(node: number): number[] {
    return this.graph.get(node) ?? [];
  }
 
  add(node: number, neighbor: number): void {
    const neighbors = this.get(node);
    neighbors.push(neighbor);
    this.graph.set(node, neighbors);
  }
 
  get root(): number {
    for (const [node, neighbors] of this.graph.entries()) {
      if (neighbors.length === 1) {
        return node;
      }
    }
    throw new Error('There is no root node.');
  }
}
 
export function restoreArray(adjacentPairs: number[][]): number[] {
  const graph = new Graph();
  for (const [u, v] of adjacentPairs) {
    graph.add(u, v);
    graph.add(v, u);
  }
 
  const answer: number[] = [];
  const dfs = (node: number, prev?: number) => {
    answer.push(node);
    for (const neighbor of graph.get(node)) {
      if (prev !== neighbor) {
        dfs(neighbor, node);
      }
    }
  };
  dfs(graph.root);
  return answer;
}