133.克隆图
解答该题思路为dfs+哈希表查重。
-
首先,我们可以对该图进行遍历,从起始点开始。那么存在一个问题,如何确定遍历点未重复,以及确定遍历终点。此时我们可以利用哈希表的特性进查重。
-
以下为范例:
//我们可以在类体中定义哈希表,进行判断 class Solution { private final Map<Integer, Node> map = new HashMap<>(); public Node cloneGraph(Node node) { return node == null ? null : help(node); } private Node help(Node node) { //该处结点copy确保每次克隆对象正确,唯一。 Node copy = map.getOrDefault(node.val, new Node()); //此处为递归终点判断,若所有点均完成克隆,则可以结束递归。 if (copy.val == 0) { copy.val = node.val; map.put(copy.val, copy); for (Node n : node.neighbors) { copy.neighbors.add(help(n)); } } //此处返回值,进行回溯,对原图进行复制。 return copy; } } /* // Definition for a Node. class Node { public int val; public List<Node> neighbors; public Node() { val = 0; neighbors = new ArrayList<Node>(); } public Node(int _val) { val = _val; neighbors = new ArrayList<Node>(); } public Node(int _val, ArrayList<Node> _neighbors) { val = _val; neighbors = _neighbors; } } */
-
本题考验对递归及图的掌握。