Leetcode link: https://leetcode.com/problems/clone-graph/
本题要求克隆一个图。这里需要的注意的是,每个节点的相邻节点可能有重复,所以需要一个map检查重复节点。另外,本题还有两个解法:深度优先遍历和广度优先遍历。可以参考https://blog.csdn.net/linhuanmars/article/details/22715747,从这个链接我们可以看到广度优先和深度优先的遍历区别在于,前者用队列做数据结构,后者用栈做数据结构。我比较喜欢本体的递归实现,很简洁。
以下是C++代码,空间复杂度是O(n),时间复杂度也是O(n)。
class Solution {
map<UndirectedGraphNode *, UndirectedGraphNode *> m_map;
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL)
return NULL;
UndirectedGraphNode * result = new UndirectedGraphNode(node->label);
m_map[node] = result;
for (int i=0; i<node->neighbors.size(); ++i)
result->neighbors.push_back( m_map[node->neighbors[i]]? m_map[node->neighbors[i]]: cloneGraph(node->neighbors[i]) );
return result;
}
};