/*
// 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 {
private:
void BreadthFirstSearch (struct Node* node) {
bool check[128] = { 0, };
queue<struct Node*> buffer;
buffer.push (node);
while (!buffer.empty()) {
auto current = buffer.front(); buffer.pop();
if (check[current->val] == true) continue;
else check[current->val] = true;
cout << current->val << " : ";
for (const auto& element : current->neighbors) {
buffer.push (element);
cout << element->val << " ";
}
cout << endl;
}
return;
}
public:
struct Node* cloneGraph(struct Node* node) {
if (node == NULL) return NULL;
bool check[128] = { 0, };
queue<struct Node*> buffer, copyBuffer;
buffer.push (node);
struct Node* clone = new struct Node;
if (clone == NULL) throw;
clone->val = node->val;
copyBuffer.push (clone);
while (!buffer.empty()) {
auto& current = buffer.front(); buffer.pop();
auto& destination = copyBuffer.front(); copyBuffer.pop();
if (check[current->val] == true) continue;
else check[current->val] = true;
// cout << current->val << ' ' << destination->val << ' ';
// printf ("%p %p\n", ¤t, &destination);
for (const auto& element : current->neighbors) {
buffer.push (element);
struct Node* newNode = new struct Node;
if (newNode == NULL) throw;
newNode->val = element->val;
destination->neighbors.push_back (newNode);
copyBuffer.push (newNode);
}
}
BreadthFirstSearch (node); cout << endl;
BreadthFirstSearch (clone); cout << endl;
return clone;
}
};
I'm trying to solve problem number 133 on LeetCode. I keep getting:
You must return a copy of all the nodes in the original graph
What needs to be corrected?
There can be multiple edges that end at the same node, so you should not skip the iteration when a node has already been visited like you do here:
if (check[current->val] == true) continue;
You can instead store an array of pointers to all the copied nodes and reuse the same node if it has already been copied to maintain the correct references.
Node* copies[101]{}; // replace the check array with this
// ...
copyBuffer.push(copies[node->val] = clone);
// inside BFS:
for (const auto& element : current->neighbors) {
if (copies[element->val]) {
destination->neighbors.push_back(copies[element->val]);
continue;
}
buffer.push(element);
struct Node* newNode = new struct Node;
newNode->val = element->val;
destination->neighbors.push_back (newNode);
copyBuffer.push(copies[element->val] = newNode);
}
Also, you should not take references to the elements at the front of the queue as they are removed right after.
auto current = buffer.front(); buffer.pop(); // NOT auto&
auto destination = copyBuffer.front(); copyBuffer.pop();