代码之家  ›  专栏  ›  技术社区  ›  DK100

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

  •  6
  • DK100  · 技术社区  · 7 年前

    假设有一个图形。节点的形式为GraphNode。图可以有重复的节点。我们必须在图上做BFS。我们在开始时不知道整个图,即无法索引图的节点。例如,只有根节点作为BFS函数的输入。

    这是图形节点的定义,不能更改。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Horse Badorties    7 年前

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

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