[LeetCode] 133. Clone Graph

思路:
这里两个思路, 第一个是DFS, 第二个是BFS. 大同小异, 都是要用一个哈希表, 哈希表第一项是原图的节点, 第二项是原图对应的新图的该节点. 哈希的好处是一能记录当前节点是否之前已经创造过新节点了, 二是维护了第二个图各节点之间的关系.

UndirectedGraphNode* dfs(unordered_map<UndirectedGraphNode*, UndirectedGraphNode*>& hashmap, 
                            UndirectedGraphNode* node) {
    if (! node) return NULL;
    if (! hashmap.count(node)) {
        hashmap[node] = new UndirectedGraphNode(node->label);
        for (int i = 0; i < node->neighbors.size(); i++) 
            hashmap[node]->neighbors.push_back(dfs(hashmap, node->neighbors[i]));
    }
    return hashmap[node];
}

UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
    unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> hashmap;
    return dfs(hashmap, node);
}
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
    if (! node) return NULL;
    unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> hashmap;
    queue<UndirectedGraphNode*> q;

    UndirectedGraphNode* new_node = new UndirectedGraphNode(node->label);
    hashmap[node] = new_node;
    q.push(node);

    while (! q.empty()) {
        UndirectedGraphNode* cur = q.front();
        q.pop();
        for (int i = 0; i < cur->neighbors.size(); i++) {
            UndirectedGraphNode* curNeighbor = cur->neighbors[i];
            if (! hashmap.count(curNeighbor)) {
                hashmap[curNeighbor] = new UndirectedGraphNode(curNeighbor->label);
                q.push(curNeighbor);
            }
            hashmap[cur]->neighbors.push_back(hashmap[curNeighbor]);
        }
    }

    return new_node;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值