1. 程式人生 > >Crack LeetCode 之 133. Clone Graph

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