【Leetcode】-图系列
题目
- 克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
代码
深度优先
class Solution {
public:
unordered_map<Node*, Node*> hs;
Node* cloneGraph(Node* node) {
if (!node) return NULL;
return dfs(node);
}
Node* dfs(Node* node)
{
if(hs[node]) return hs[node]; // 递归退出条件
// 克隆一个节点
Node* clone = new Node(node->val); // 克隆节点复制
// 添加到哈希表
hs[node] = clone; // 添加过
// 添加边
for(Node* &e:node->neighbors)
{
clone->neighbors.push_back(dfs(e));
}
return clone;
}
};
class Solution {
public:
Node* cloneGraph(Node* node) {
unordered_map<Node*, Node*> hs;
if (!node) return NULL;
// 广度优先搜索
// 队列
queue<Node*> q;
// 入队
q.push(node);
// 克隆第一个节点
hs[node] = new Node(node->val);
// 队列非空
while(!q.empty())
{ // 取队首元素
auto f = q.front();
// 出队
q.pop();
// 遍历出队节点的邻居
for(auto & n: f->neighbors)
{
// 邻居节点访问过
if(hs.find(n)==hs.end())
{
// 直接将邻居节点克隆
hs[n] = new Node(n->val);
// 将邻居节点入队
q.push(n);
}
// 给新克隆的节点更新其邻居节点
hs[f]->neighbors.push_back(hs[n]);
}
}
return hs[node];
}
};
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/16213672.html