• 133. Clone Graph


        /*
         * 133. Clone Graph
         * 12.19 by Mingyang
         * 第一种方法就是我们用的那种BFS的方法,queue进行广度遍历
         * 不要忘了新建neighbor的点后要注意把关系也copy过来
         * 第二种方法就是DFS的方法,也就是stack来做深度遍历,换汤不换药
         * 无论怎么换,记住,用map比较好,可以记住两个node之间的对应关系
    * 最容易错误的地方在于queue.add(neighbor);必须在if判断句里面,不然会形成loop,只有第一次出现才可以
    */ public UndirectedGraphNode cloneGraph(UndirectedGraphNode root) { if (root == null) return null; Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>(); queue.add(root); map.put(root, new UndirectedGraphNode(root.label)); while (!queue.isEmpty()) { UndirectedGraphNode node = queue.poll(); // handle the neighbors for (UndirectedGraphNode neighbor : node.neighbors) { if (!map.containsKey(neighbor)) { map.put(neighbor, new UndirectedGraphNode(neighbor.label));
    // 这就是一个映射的影子,对于每一个元素,在地图中注册下你的影子
    //这里的queue必须放在if里面加
    queue.add(neighbor); } // copy the neighbor map.get(node).neighbors.add(map.get(neighbor));
    // 当注册好影子以后,我们需要把原图中的关系也copy过来 } } return map.get(root); } // 用非递归的DFS来做,也就是用Stack public UndirectedGraphNode cloneGraph2(UndirectedGraphNode root) { if (root == null) return null; HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); LinkedList<UndirectedGraphNode> stack = new LinkedList<UndirectedGraphNode>(); UndirectedGraphNode head = new UndirectedGraphNode(root.label); map.put(root, head); stack.push(root); while (!stack.isEmpty()) { UndirectedGraphNode node = stack.pop(); for (UndirectedGraphNode neighbor : node.neighbors) { if (!map.containsKey(neighbor)) { map.put(neighbor, new UndirectedGraphNode(neighbor.label)); stack.push(neighbor); } map.get(node).neighbors.add(map.get(neighbor)); } } return head; } //用递归的DFS public UndirectedGraphNode cloneGraph3(UndirectedGraphNode node) { if(node == null) return null; HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); UndirectedGraphNode head = new UndirectedGraphNode(node.label); map.put(node, new UndirectedGraphNode(node.label)); dfs(map, node);//DFS return head; } public void dfs(HashMap<UndirectedGraphNode, UndirectedGraphNode> map, UndirectedGraphNode node){ if(node == null) return; for(UndirectedGraphNode neighbor: node.neighbors){ if(!map.containsKey(neighbor)){ map.put(neighbor, new UndirectedGraphNode(neighbor.label)); dfs(map, neighbor);//DFS } map.get(node).neighbors.add(map.get(neighbor)); } }
  • 相关阅读:
    java第十三周作业
    java第十三周随堂
    安卓作业
    5.29 第十三周作业
    5.28第十三周上机练习
    5.22第十二周作业
    5.21第十二章上机练习
    5.15 第十一周作业
    5.14 第十一周 上机练习
    5.7第十周上机练习
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5518588.html
Copyright © 2020-2023  润新知