Clone an undirected graph. Each node in the graph contains a label
and a list of its neighbors
.
OJ's undirected graph serialization:
Nodes are labeled uniquely.
We use #
as a separator for each node, and ,
as a separator for node label and each neighbor of the node.
As an example, consider the serialized graph {0,1,2#1,2#2,2}
.
The graph has a total of three nodes, and therefore contains three parts as separated by #
.
- First node is labeled as
0
. Connect node0
to both nodes1
and2
. - Second node is labeled as
1
. Connect node1
to node2
. - Third node is labeled as
2
. Connect node2
to node2
(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
思路:用BFS来收集node,clone nodes之后,再clone neighbors,也就是边的关系;
/*
// 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;
}
}
*/
class Solution {
public Node cloneGraph(Node node) {
if(node == null) {
return null;
}
HashMap<Node, Node> hashmap = new HashMap<>();
// copy node;
Queue<Node> queue = new LinkedList<>();
HashSet<Node> visited = new HashSet<>();
queue.offer(node);
visited.add(node);
while(!queue.isEmpty()) {
Node n = queue.poll();
Node newnode = new Node(n.val);
hashmap.put(n, newnode);
for(Node neighbor: n.neighbors) {
if(!visited.contains(neighbor)) {
visited.add(neighbor);
queue.offer(neighbor);
}
}
}
// copy edge;
for(Node n: visited) {
for(Node neighbor: n.neighbors) {
hashmap.get(n).neighbors.add(hashmap.get(neighbor));
}
}
return hashmap.get(node);
}
}
思路:copy的时候,neighbor需要加入clone的node,还有加入hashmap是为了避免反复重复来回clone,因为hashmap是一对一的关系。另外,hashmap要提前加入,这样hashmap里面有一对一的关系,这样recrusion的时候会避免来回clone;
/*
// 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;
}
}
*/
class Solution {
public Node cloneGraph(Node node) {
if(node == null) {
return null;
}
HashMap<Node, Node> hashmap = new HashMap<>();
dfs(node, hashmap);
return hashmap.get(node);
}
private Node dfs(Node node, HashMap<Node, Node> hashmap) {
if(hashmap.containsKey(node)) {
return hashmap.get(node);
} else {
Node newnode = new Node(node.val);
// copy node;
hashmap.put(node, newnode);
// copy edge;
for(Node neighbor: node.neighbors) {
newnode.neighbors.add(dfs(neighbor, hashmap));
}
return hashmap.get(node);
}
}
}