在广度优先搜索中处理重复节点

时间:2017-09-10 18:51:56

标签: java duplicates graph-theory breadth-first-search graph-traversal

想象一下有一个图表。节点的格式为GraphNode。该图可以有重复的节点。我们必须在图表上做一个BFS。我们在开始时不知道整个图,即,没有办法索引图的节点。例如,只有根节点作为BFS函数的输入。

这是GraphNode的定义,不能改变。

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

在BFS算法中处理访问节点的最佳方法是什么?请记住,图表具有重复的节点,即具有相同密钥的多个节点。我们不想删除或忽略重复项。

1 个答案:

答案 0 :(得分:1)

为什么这些重复键对于广度优先遍历很重要?

E.g。

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);
        } 
    }
}