133. Clone Graph

56 篇文章 0 订阅
8 篇文章 0 订阅


题目描述

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 node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.
Visually, the graph looks like the following:

   1
  / \
 /   \
0 --- 2
     / \
     \_/

题意分析

克隆一个图
每次添加一个节点, 并且保存他的邻居信息.

其中一个难点就是邻居可能已经出现过,你只要把他的指针加到邻居集合中即可,也有可能这个结点还没出现过,因此你需要新建一个这个结点,因此我们需要一个hash表来对结点做一一映射.

本题有两种方法来做,广度搜索BFS和深度搜索DFS.
我选择了DFS,更简洁.
参考了别人的更优雅的代码, 改进了自己的代码

实现

/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {  
public:  
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {  
        if(!node) return NULL;  // empty node 
        if(hash.count(node)) return hash[node]; // the node exists

        hash[node] = new UndirectedGraphNode(node->label);  // create the node
        for(auto neighbor: node->neighbors)   // add neighbors
            hash[node]->neighbors.push_back(cloneGraph(neighbor));  
        return hash[node];  
    }  
private:  
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> hash;  
}; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值