leetcode133_克隆圖_回溯

一. 可以參考leetcode138_複製帶隨機指針的鏈表, https://blog.csdn.net/qieyuan4083/article/details/104332467

二. 回溯就是遍歷, 運用DFS和BFS方法.

1. DFS.

/*
// Definition for a Node.
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;
    }
};
*/
class Solution {
public:
    //存放訪問過的圖節點,
    //注意存的是指針.
    map<Node*, Node*> tmp;
    //函數的作用遍歷所有的節點,
    //並返回相應的節點.
    Node* cloneGraph(Node* node) {
        if(node==NULL) return NULL;
        //有這個節點,直接返回.
        if(tmp.count(node)) return tmp[node];
        //否則新建.
        Node* n = new Node(node->val);
        tmp[node] = n; 
        //遍歷原先node的所有鄰居,並分別拷貝.
        for(auto k:node->neighbors) {
            n->neighbors.push_back(cloneGraph(k));
        }
        return n;
    }
};

2. BFS 

class Solution {
public:
    Node* cloneGraph(Node* node) {
        if(node==NULL) return NULL;
        //存放已經克隆過的節點.
        map<Node*, Node*> mp;
        //建立新的克隆節點,但是他的鄰居是沒有填充的.
        Node* n = new Node(node->val);
        mp[node] = n;
        //bfs一般用到隊列.
        queue<Node*> dq;
        dq.push(node);
        while(!dq.empty()) {
            Node* tmp = dq.front();
            dq.pop();
            //對於克隆前的節點的所有鄰居
            for(auto k:tmp->neighbors) {
                if(!mp.count(k)) {
                    //如果不存在就創建.
                    node = new Node(k->val);
                    mp[k] = node;
                    //不存在才需要放入隊列中.
                    //因爲存在的節點的鄰居接下來就會弄齊.
                    dq.push(k);
                }
                //如果存在就直接放入克隆後的節點的鄰居vector裏.
                mp[tmp]->neighbors.push_back(mp[k]);
                
            }
        }
        //返回第一個克隆的節點.
        return n;
    }
};

發佈了95 篇原創文章 · 獲贊 26 · 訪問量 2123
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章