Обработка дублирующих узлов в поиске по ширине

Представь, что есть график. Узлы имеют форму GraphNode. Граф может иметь дубликаты узлов. Мы должны сделать BFS на графике. Мы не знаем весь граф в начале, т. Е. Нет способа индексировать узлы графа. Например, в качестве входных данных для функции BFS указан только корневой узел.

Это определение GraphNode, и его нельзя изменить.

public class GraphNode {
  int val;
  GraphNode left;
  GraphNode right;
  GraphNode(int x) { val = x; }
}

Каков наилучший способ обработки посещенных узлов в алгоритме BFS? Помните, что у графа есть повторяющиеся узлы, то есть несколько узлов с одинаковым ключом. И мы не хотим удалять или игнорировать дубликаты.

1 ответ

Решение

Почему эти дубликаты ключей имеют значение для вашего обхода в ширину?

Например

static void breadthFirstVisit(TreeNode root) {
    Deque<TreeNode> queue = new LinkedList();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.println("visiting node with value " + node.val);
        // visit(visitedNode)
        if (node.left != null) queue.add(node.left);
        if (node.right != null) queue.add(node.right);
    }
}

или как так, опуская дубликаты

 static void breadthFirstVisit(TreeNode root) {
    Deque<TreeNode> queue = new LinkedList();
    Set<TreeNode> visited = new HashSet();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.println("visiting node with value " + node.val);
        // visit(visitedNode)
        if (node.left != null && !visited.contains(node.left)) {
            queue.add(node.left);
            visited.add(node.left);
        } 
        if (node.right != null && !visited.contains(node.right)) {
            queue.add(node.right);
            visited.add(node.right);
        } 
    }
}
Другие вопросы по тегам