Leetcode 133 克隆图

题目描述:

 题解:考察的点是图的遍历,要么DFS要么BFS。一开始一直在想怎么把无向图的边不遗漏的复制出来,想了一些比较复杂的方法。

看了一下别人的做法,其实只需要把无向边看做两条有向边,用一个map来映射每个node对应的copy_node。如果node存在对应的copy_node,说明这个节点

之前访问过,直接返回map的value就可以;如果不存在对应的copy_node,那就新建一个copy_node,然后将对应的边递归的添加就好。

(对于双向图的处理,dfs的设计以及利用mp来替代常规dfs中vis数组的作用)

AC代码:

class Solution {
public:
    Node* dfs(Node* node)
    {
        if(node == NULL) return NULL;
       // cout << node->val <<endl;
        if(mp.find(node) != mp.end()) return mp[node];
        Node* now = new Node(node->val);
        mp[node] = now;
        int Len = node->neighbors.size();
        for(int i=0;i<Len;i++)
        {
            now->neighbors.push_back(dfs(node->neighbors[i]));
        }
        
        return now;
    }
    Node* cloneGraph(Node* node) {
        // if(node == NULL) return NULL;
        mp.clear();
        return dfs(node);
    }
private:
    map<Node*,Node*> mp;
};
原文地址:https://www.cnblogs.com/z1141000271/p/12562355.html