Crack LeetCode 之 133. Clone Graph

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;
    }
};

猜你喜欢

转载自blog.csdn.net/tassardge/article/details/83714094