133.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. 'use strict'
  2. /**
  3. * Definition for undirected graph.
  4. * function UndirectedGraphNode(label) {
  5. * this.label = label;
  6. * this.neighbors = []; // Array of UndirectedGraphNode
  7. * }
  8. */
  9. function UndirectedGraphNode(label) {
  10. this.label = label
  11. this.neighbors = [] // Array of UndirectedGraphNode
  12. }
  13. /**
  14. * @param {UndirectedGraphNode} graph
  15. * @return {UndirectedGraphNode}
  16. */
  17. var cloneGraph = function (graph) {
  18. if (graph == null) return null
  19. const map = new Map()
  20. return clone(graph, map)
  21. }
  22. /**
  23. * @param {UndirectedGraphNode} node
  24. * @param {Map} map
  25. * @return {UndirectedGraphNode}
  26. */
  27. function clone(node, map) { // DFS
  28. if (node === null) return null
  29. if (map.get(node.label) !== undefined)
  30. return map.get(node.label)
  31. const copy = new UndirectedGraphNode(node.label)
  32. map.set(copy.label, copy)
  33. for (const n of node.neighbors) {
  34. copy.neighbors.push(clone(n, map))
  35. }
  36. return copy
  37. }
  38. function __main__() {
  39. /* eslint no-console: ["error", {allow: ["log"]}] */
  40. const logger = console.log.bind(console)
  41. const n3 = new UndirectedGraphNode(3)
  42. const n2 = new UndirectedGraphNode(2)
  43. const n1 = new UndirectedGraphNode(1)
  44. n3.neighbors = [n2, n3]
  45. n2.neighbors = [n1, n3]
  46. n1.neighbors = [n2, n3]
  47. const n = cloneGraph(n1)
  48. logger(n)
  49. }
  50. __main__()