133. 克隆图

发布时间 2024-01-09 19:33:15作者: 不是孩子了

DFS&BFS
队列queue
unordered_map容器(无序map容器)
C++中for auto的用法

//克隆图
#include<iostream>
#include<string>
#include<unordered_map>
#include<vector>
#include<queue>
using namespace std;

//图节点定义
class Node {
public:
    int val;
    vector<Node*> neighbors;
    Node() {
        val = 0;
        neighbors = vector<Node*>();
    }
    Node(int _val) {
        val = _val;
        neighbors = vector<Node*>();
    }
    Node(int _val, vector<Node*> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
};


unordered_map<int, Node*> map;

//方法一:深度优先搜索
Node* cloneGraph(Node* node) {
    //空节点不克隆
    if (!node) {
        return nullptr;
    }

    //克隆的节点不克隆
    if (map.find(node->val) != map.end()) {
        return map[node->val];
    }

    //创建克隆节点
    Node* clonenode = new Node(node->val);
    map[node->val] = clonenode; //存储克隆节点

    //克隆邻接表
    for (auto& n : node->neighbors) {
        clonenode->neighbors.push_back(cloneGraph(n));
    }

    return clonenode;
}



//方法二:广度优先搜索
Node* cloneGraph(Node* node) {
    //空节点不拷贝
    if (!node) {
        return nullptr;
    }

    map[node->val] = new Node(node->val); //存储克隆节点
    queue<Node*> _queue;
    _queue.push(node); //当前节点入队

    Node* temp; //当前处理的节点
    while (!_queue.empty()) {
        temp = _queue.front(); //取队首元素
        _queue.pop();          //弹出队首元素
        Node* cloneNode = map[temp->val]; //取当前节点克隆节点
        for (auto& neighbor : temp->neighbors) {
            if (map.find(neighbor->val) == map.end()) { //邻居未拷贝
                map[neighbor->val] = new Node(neighbor->val); //存储克隆节点
                _queue.push(neighbor);                        //邻居入队
            }
            cloneNode->neighbors.push_back(map[neighbor->val]); //存储邻接关系
        }
    }

    return map[node->val];
}

int main()
{
    return 0;
}