【leetcode】133. Clone Graph

女爷i 2022-09-28 14:25 106阅读 0赞

133. Clone Graph

这里写图片描述

这道题目的意思是:对一个无向图进行深拷贝,即需要申请一个新的空间,并将原来的无向图中的节点及相关信息拷贝到这个新的空间。因此解题思路其实就是对这个无向图进行遍历,并且一边遍历一边深拷贝即可。对于无向图的遍历,可以采用深度遍历(DFS)和广度遍历(BFS)完成,两者的时间复杂度和空间复杂度都是O(n)。

方法一:深度遍历(DFS)

  1. // Definition for undirected graph.
  2. struct UndirectedGraphNode {
  3. int label;
  4. vector<UndirectedGraphNode *> neighbors;
  5. UndirectedGraphNode(int x) : label(x) {};
  6. };
  7. class Solution {
  8. public:
  9. // Deep-First-Search (DFS)
  10. UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
  11. if (node == NULL) return NULL;
  12. // key is original node, value is the copied node
  13. unordered_map<const UndirectedGraphNode *, UndirectedGraphNode *> copy;
  14. Clone(node, copy);
  15. return copy[node];
  16. }
  17. private:
  18. static UndirectedGraphNode* Clone(const UndirectedGraphNode* node,
  19. unordered_map<const UndirectedGraphNode*, UndirectedGraphNode *> &copy) {
  20. // a copy existed
  21. if (copy.find(node) != copy.end()) return copy[node];
  22. // copy a node
  23. UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label);
  24. copy[node] = newNode;
  25. for (auto nbptr : node->neighbors)
  26. newNode->neighbors.push_back(Clone(nbptr, copied));
  27. return newNode;
  28. }
  29. };

方法二:广度遍历(BFS)

  1. // Definition for undirected graph.
  2. struct UndirectedGraphNode {
  3. int label;
  4. vector<UndirectedGraphNode *> neighbors;
  5. UndirectedGraphNode(int x) : label(x) {};
  6. };
  7. class Solution {
  8. public:
  9. // BFS
  10. UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
  11. if (node == NULL) return NULL;
  12. // key is original node, value is the copied node
  13. unordered_map<const UndirectedGraphNode *, UndirectedGraphNode *> copied;
  14. // each node in queue is copied itself but neighbours are not
  15. queue<const UndirectedGraphNode*> q;
  16. q.push(node);
  17. copied[node] = new UndirectedGraphNode(node->label);
  18. while (!q.empty()) {
  19. const UndirectedGraphNode* cur = q.front();
  20. q.pop();
  21. for (auto nbptr : cur->neighbors) {
  22. // a copy is existed
  23. if (copied.find(nbptr) != copied.end()) {
  24. copied[cur]->neighbors.push_back(copied[nbptr]);
  25. } else {
  26. UndirectedGraphNode* newNode = new UndirectedGraphNode(nbptr->label);
  27. copied[nbptr] = newNode;
  28. copied[cur]->neighbors.push_back(newNode);
  29. q.push(nbptr);
  30. }
  31. }
  32. }
  33. return copied[node];
  34. }
  35. };

发表评论

表情:
评论列表 (有 0 条评论,106人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode133. Clone Graph

    133. Clone Graph ![这里写图片描述][SouthEast] 这道题目的意思是:对一个无向图进行深拷贝,即需要申请一个新的空间,并将原来的无向图中的节点