All files / graphs dfs.js

0% Statements 0/17
0% Branches 0/2
0% Functions 0/3
0% Lines 0/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                                                                                                               
import GraphAction from '../../utils/GraphAction';
import Stack from '../trekhleb/src/data-structures/stack/Stack';
import Color from '../../utils/Color';
 
export default function dfs(graph, startVertex) {
  const stack = new Stack();
  const visited = [];
  const actions = [];
  stack.push(startVertex);
 
  actions.push({
    do: {
      action: GraphAction.HIGHLIGHT_NODE,
      color: Color.GRAPH_HIGHLIGHTED_NODE,
      elements: startVertex.getKey(),
    },
    undo: {
      action: GraphAction.HIGHLIGHT_NODE,
      color: Color.BASE_COLOR_NODE,
      elements: startVertex.getKey(),
    },
  });
 
  while (!stack.isEmpty()) {
    const action = [];
    const currentVertex = stack.pop();
 
    action.push({
      do: {
        action: GraphAction.HIGHLIGHT_NODE,
        color: Color.GRAPH_RESULT_TRUE,
        elements: currentVertex.getKey(),
      },
      undo: {
        action: GraphAction.HIGHLIGHT_NODE,
        color: Color.GRAPH_HIGHLIGHTED_NODE,
        elements: currentVertex.getKey(),
      },
    });
 
    if (!(visited.includes(currentVertex))) {
      visited.push(currentVertex);
    }
 
    currentVertex.getNeighbors().filter((item) => !(visited.includes(item))).forEach((item) => {
      stack.push(item);
      action.push({
        do: {
          action: GraphAction.HIGHLIGHT_NODE,
          color: Color.GRAPH_HIGHLIGHTED_NODE,
          elements: item.getKey(),
        },
        undo: {
          action: GraphAction.HIGHLIGHT_NODE,
          color: Color.BASE_COLOR_NODE,
          elements: item.getKey(),
        },
      });
    });
    actions.push(action);
  }
  return actions;
}