

A data structure made up of nodes or vertices and edges or the connections between nodes
Typically, a visualization of a graph will be of nodes represented by circles and edges as lines between the circles
Trees vs Graph
Trees art just a special kind of graph with one root and only on unique path between any two nodes
A graph can go beyond that and have any number of root elements and multiple paths between nodes

1) Vertex list + Egde list
const vertices = ['A', 'B', 'C', 'D', 'E'];
const edges = [
  ['A', 'B'],
  ['A', 'D'],
  ['B', 'C'],
  ['C', 'D'],
  ['C', 'E'],
  ['D', 'E']
]
// findeAdjacentNodes
const findAdjacentNodes = (node) => {
  // Loop through edges array
  // Is my node in the connection?
  // If yes, push the other node in pair, into adjacentNodes array
  // If no, keep looping
  const adjacentNodes = [];
  for (let edge of edges) {
    const nodeIdx = edge.indexOf(node);
    if (nodeIdx > -1) {
      let adjacentNode = nodeIdx === 0 ? edge[1] : edge[0]
      adjacentNodes.push(adjacentNode);
    }
  }
  return adjacentNodes;
};
const isConnected = (node1, node2) => {
  return edges.some((edge) => {
    return edge.indexOf(node1) > -1 && edge.indexOf(node2) > -1
  })
};2) Ajacency Matrix
const vertices = ['A', 'B', 'C', 'D', 'E'];
const vertexIdxs = {
  'A': 0,
  'B': 1,
  'C': 2,
  'D': 3,
  'E': 4,
};
const adjacenyMatrix = [
  [0,1,0,1,0],
  [1,0,1,0,0],
  [0,1,0,1,1],
  [1,0,1,0,1],
  [0,0,1,1,0],
];
// findAdjacencies
const findAdjacencies = (node) => {
  const adjacentNodes = [];
  // get the row in the matrix
  // loop through the row
  // if there is 1, push that node
  // otherwise skip
  for (let i = 0; i < vertices.length; i++) {
    let nodeVertext = vertexIdxs[node];
    if(adjacenyMatrix[nodeVertext][i] === 1) {
      adjacentNodes.push(vertices[i]);
    } 
  }
  return adjacentNodes;
}
// isConnected
const isConnected = (node1, node2) => {
  const nodeIdx1 = vertexIdxs[node1];
  const nodeIdx2 = vertexIdxs[node2];
  return !!adjacenyMatrix[nodeIdx1][nodeIdx2];
};
3) Ajacency List
class Node {
  constructor(value) {
    this.value = value;
    this.edgeList = [];
  }
  connect(node) {
    this.edgeList.push(node);
    node.edgeList.push(this);
  }
  getAdjacentNodes() {
    return this.edgeList.map(edge => edge.value);
  }
  isConnect(node) {
    return this.edgeList.map(edge => edge.value).indexOf(node.value) > -1;
  }
}
class Graph {
  constructor(nodes) {
    this.nodes = [...nodes];
  }
  addToGraph(node) {
    this.nodes.push(node);
  }
}
const nodeA = new Node('A');
const nodeB = new Node('B');
const nodeC = new Node('C');
const nodeD = new Node('D');
const nodeE = new Node('E');
const graph = new Graph([nodeA, nodeB, nodeC, nodeD, nodeE]);
nodeA.connect(nodeB);
nodeA.connect(nodeD);
nodeB.connect(nodeC);
nodeC.connect(nodeD);
nodeC.connect(nodeE);
nodeD.connect(nodeE);
// for (let node of graph.nodes) {
//   console.log(`Node ${node.value}`);
//   for (let connectedNode of node.edgeList) {
//     console.log(`Node ${node.value} is connected to ${connectedNode.value}`);
//   }
// }
console.log(nodeA.getAdjacentNodes());
console.log(nodeA.isConnect(nodeB));참고: Graph Data Structure with 3 Javascript Implementations - codebyte