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 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 / \ \_/<Solution>
這題的題意其實就是要做 deep copy,即要完整複製一份 undirected graph
有DFS和BFS兩種解法,這次使用 DFS 來解
想法如下
- 因為題目有說,每個 label 都是唯一的,所以使用一個 hash map 來記錄已經創好的 node,避免創建出多餘的node
- 用 DFS 去處理 neighbors 的拷貝。先把一條完整的 path 串完,再回頭找下一條
c++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Definition for undirected graph. | |
* struct UndirectedGraphNode { | |
* int label; | |
* vector<UndirectedGraphNode *> neighbors; | |
* UndirectedGraphNode(int x) : label(x) {}; | |
* }; | |
*/ | |
class Solution { | |
private: | |
unordered_map<int, UndirectedGraphNode *> nodeMap; | |
public: | |
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { | |
return deepCopy(node); | |
} | |
UndirectedGraphNode *deepCopy(UndirectedGraphNode *node) { | |
if(!node) { | |
return NULL; | |
} | |
else if(nodeMap.count(node->label)) { | |
return nodeMap[node->label]; | |
} | |
UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label); | |
nodeMap[node->label] = newNode; | |
//>> copy neighbors by using DFS | |
for(auto n : node->neighbors) { | |
newNode->neighbors.push_back(deepCopy(n)); | |
} | |
return newNode; | |
} | |
}; |
kotlin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Definition for a Node. | |
* class Node(var `val`: Int) { | |
* var neighbors: ArrayList<Node?> = ArrayList<Node?>() | |
* } | |
*/ | |
class Solution { | |
private val map = mutableMapOf<Int,Node>() | |
fun cloneGraph(node: Node?): Node? { | |
return deepCopy(node) | |
} | |
fun deepCopy(node: Node?): Node? { | |
if (node == null) { | |
return null | |
} else if(map.contains(node!!.`val`)) { | |
return map[node!!.`val`] | |
} | |
val newNode = Node(node!!.`val`) | |
map[node!!.`val`] = newNode | |
for(n in node!!.neighbors) { | |
newNode.neighbors.add(deepCopy(n)) | |
} | |
return newNode | |
} | |
} |
沒有留言:
張貼留言