一、深度优先
Java:
/*
// 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 {
Map<Integer,Node> clone=new HashMap<Integer,Node>();
public Node cloneGraph(Node node) {
if(node==null) return null;
if(clone.containsKey(node.val)) return clone.get(node.val);
Node cloneNode=new Node(node.val);
clone.put(node.val,cloneNode);
for(Node s:node.neighbors){
cloneNode.neighbors.add(cloneGraph(s));
}
return cloneNode;
}
}
C++:
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
unordered_map<int,Node*> map;
Node* cloneGraph(Node* node) {
if(node==nullptr) return node;
if(map.count(node->val)) return map[node->val];
Node* clonenode=new Node(node->val);
map.emplace(node->val,clonenode);
for(Node* s:node->neighbors){
clonenode->neighbors.push_back(cloneGraph(s));
}
return clonenode;
}
};
二、广度优先
Java:
/*
// 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 node;
Queue<Node> queue=new LinkedList<Node>();
Map<Node,Node> map=new HashMap<Node,Node>();
queue.offer(node);
map.put(node,new Node(node.val));
while(!queue.isEmpty()){
Node node2=queue.poll();
for(Node s:node2.neighbors){
if(!map.containsKey(s)) {
map.put(s,new Node(s.val));
queue.offer(s);
}
map.get(node2).neighbors.add(map.get(s));
}
}
return map.get(node);
}
}
C++:
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
Node* cloneGraph(Node* node) {
if(node==nullptr) return node;
queue<Node*> que;
unordered_map<Node*,Node*> map;
map[node]=new Node(node->val);//插入方式1
que.push(node);
while(!que.empty()){
Node* node2=que.front();
que.pop();
for(Node* s:node2->neighbors){
if(map.count(s)==0){
map.emplace(s,new Node(s->val));//插入方式2
que.push(s);
}
map[node2]->neighbors.push_back(map[s]);
}
}
return map[node];
}
};