LeetCode133.克隆图

LeetCode133.克隆图

可以使用DFS和BFS。参考https://blog.csdn.net/qq508618087/article/details/50806972

1.DFS 判断当前节点是否被创建,如果创建直接返回。使用unordered_map来存储已经建立的节点。递归访问每个节点和每个邻居

class Solution {
public:
	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
		if (!node) return NULL;
		if (hash.count(node)) return hash[node];//当前unorder_map中已经存在直接反回
		hash[node] = new UndirectedGraphNode(node->label);
		for (auto val : node->neighbors)
			hash[node]->neighbors.push_back(cloneGraph(val));
		return hash[node];
	}

private:
	unordered_map<UndirectedGraphNode *, UndirectedGraphNode *>hash;
};

2.BFS 使用队列来存储已经构建好的节点。首先将起始节点放入队列,然后进行广度遍历,遍历的对象为当前节点的邻居节点,如果还没被创建,则创建并放入队列。最后将会遍历所有节点完成克隆。

class Solution {
public:
	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
		if (!node) return NULL;
        UndirectedGraphNode* graph = new UndirectedGraphNode(node->label);
        hash[node] = graph;
        queue<UndirectedGraphNode*> q;
        q.push(node);
        while (!q.empty()) {
            auto curNode = q.front();
            q.pop();
            for (auto val : curNode->neighbors) {
                if (hash.find(val) == hash.end()) {
                    hash[val] = new UndirectedGraphNode(val->label);
                    q.push(val);
                }
                hash[curNode]->neighbors.push_back(hash[val]);
            }
        }
        return graph;
	}

private:
	unordered_map<UndirectedGraphNode *, UndirectedGraphNode *>hash;
};

猜你喜欢

转载自blog.csdn.net/Gentlemanman/article/details/83927243