【Leetcode】-图系列

题目

  1. 克隆图

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

代码

深度优先



class Solution {
public:
    unordered_map<Node*, Node*> hs;
    Node* cloneGraph(Node* node) {
        if (!node) return NULL;
        return dfs(node);
    }
    Node* dfs(Node* node)
    {
        if(hs[node]) return hs[node]; // 递归退出条件
        // 克隆一个节点
        Node* clone = new Node(node->val); // 克隆节点复制
        // 添加到哈希表
        hs[node] = clone; // 添加过
        // 添加边
        for(Node* &e:node->neighbors)
        {
            clone->neighbors.push_back(dfs(e));
        }
        return clone;
    }
};


class Solution {
public:
    
    Node* cloneGraph(Node* node) {
        unordered_map<Node*, Node*> hs;
        if (!node) return NULL;
        // 广度优先搜索
        // 队列
        queue<Node*> q;
        // 入队
        q.push(node);
        // 克隆第一个节点
        hs[node] = new Node(node->val);
        // 队列非空
        while(!q.empty())
        {   // 取队首元素
            auto f = q.front();
            // 出队
            q.pop();
            // 遍历出队节点的邻居
            for(auto & n: f->neighbors)
            {
                // 邻居节点访问过
                if(hs.find(n)==hs.end())
                {
                    // 直接将邻居节点克隆
                    hs[n] = new Node(n->val);
                    // 将邻居节点入队
                    q.push(n); 
                }   
                // 给新克隆的节点更新其邻居节点
                hs[f]->neighbors.push_back(hs[n]);  
            }
           
        
        }
        return hs[node];
    }
};
posted @ 2022-05-01 18:58  jucw  阅读(28)  评论(0编辑  收藏  举报