โš”๏ธ
DSA Important Questions
  • ๐Ÿ˜‡README
  • ๐Ÿ”ซQuestion List
  • ๐ŸงชFormula List
  • ๐Ÿ—’๏ธ01 Array
    • โœ…Rotate Matrix
    • โœ…Max Sum Contiguous Subarray
    • Find Duplicate in Array
    • โœ…Merge Intervals
    • โœ…Spiral Order Matrix I
    • Repeat and Missing Number Array
    • โœ…Merge Overlapping Intervals
    • โœ…Set Matrix Zeros
    • โœ…Spiral Order Matrix II
    • Largest Number
    • First Missing Integer
    • โœ…Pascal Triangle
    • โญMax Distance
    • โœ…Wavy Array
    • Next Permutation
    • โœ…Min Steps in Infinite Grid
    • Flip
    • โญFind Permutation
    • โญMaximum Absolute Difference
    • โญMaximum Unsorted Subarray
    • Reorder Data in Log File
    • โœ…Make equal elements Array
  • โž•02 Math
    • โœ…Excel Column Number
    • โญExcel Column Title
    • โญGrid Unique Paths
    • โญPower Of Two Integers
    • โœ…Next Similar Number
    • โญk-th Permutation
  • ๐Ÿ”03 Binary Search
    • โญMedian of Array
    • โญSquare Root of Integer
    • โญRotated Sorted Array Search
    • โญMatrix Median
    • Capacity To Ship Packages Within B Days
  • ๐Ÿงต04 String
    • Implement StrStr
    • โญInteger to Roman
    • โญRoman to Integer
    • Length of Last Word
    • โญatoi
    • โญValid IP Addresses
    • โญCompare Version Numbers
    • โญLongest Palindromic Substring
    • Count And Say
    • Reverse the String
    • Power of 2
    • ๐ŸšงKMP: Minimum Characters Required to Make a String Palindromic
    • โญConvert to Palindrome
    • Bulls and Cows
  • 1๏ธโƒฃ05 Bit Manipulation
    • Reverse Bits
    • Single Number
    • โญDivide Integers
    • โญSingle Number II
    • โญCount Total Set Bits
    • โญPalindromic Binary Representation
  • โœŒ๏ธ06 Two Pointers
    • Merge Two Sorted Lists II
    • โญ3 Sum
    • Remove Duplicates from sorted Array
    • โญContainer With Most Water
    • Remove Element from Array
    • โญMax Continuous Series of 1s
    • Pair With Given Difference
    • โญMaximum Ones After Modification
  • ๐Ÿ”—07 Linked List
    • Swap List Nodes in Pairs
    • Rotate List
    • โญReorder List
    • Merge Two Sorted Lists
    • Remove Duplicates from Sorted List
    • Add Two Numbers as Lists
    • Remove Nth Node from List End
    • โญList Cycle
    • Intersection of Linked Lists
    • โญReverse Linked List II
    • Palindrome List
    • โญK reverse linked list
    • โญReverse Alternate K Nodes
    • โญKth Node From Middle
    • โญSort Binary Linked List
    • โญEven Reverse
  • ๐Ÿ“š08 Stacks and Queues
    • โญRain Water Trapping
    • Generate all Parentheses
    • โญLargest Rectangle in Histogram
    • โญMin Stack
    • Redundant Braces
    • Nearest Smaller Element
    • โญFirst non-repeating character in a stream of characters
    • โœ…Balanced Parantheses!
  • ๐Ÿ”™09 Backtracking
    • โญKth Permutation Sequence
    • โญCombination Sum
    • Combination Sum II
    • โญNQueens
    • Combinations
    • โญSubsets II
    • Subset
    • Palindrome Partitioning
  • ๐Ÿ’ฑ10 Hashing
    • โญLongest Consecutive Sequence
    • โญ4 Sum
    • โญAnagrams
    • โญPoints on the Straight Line
    • 2 Sum
    • โญValid Sudoku
    • Copy List
    • Longest Substring Without Repeat
  • ๐Ÿ—ป11 Heaps & Maps
    • Merge K Sorted Lists
    • โญLRU Cache
    • โญInversions
    • Distinct Numbers in Window
  • ๐ŸŒณ12 Tree Data Structure
    • โœ…Inorder Traversal
    • โญRecover Binary Search Tree
    • โญInorder Traversal of Cartesian Tree
    • โญLeast Common Ancestor
    • โญConstruct Binary Tree From Inorder And Preorder
    • Flatten Binary Tree to Linked List
    • Valid Binary Search Tree
    • โœ…Preorder Traversal
    • โญBinary Tree From Inorder And Postorder
    • Balanced Binary Tree
    • โœ…Sorted Array To Balanced BST
    • Symmetric Binary Tree
    • โœ…Postorder Traversal
    • โญPopulate Next Right Pointers Tree
    • Identical Binary Trees
    • BST Iterator
    • ZigZag Level Order Traversal BT
    • Path Sum
    • Next Pointer Binary Tree
    • Min Depth of Binary Tree
    • Root to Leaf Paths With Sum
    • โญKth Smallest Element in Tree
    • โญ2-Sum Binary Tree
    • Vertical Order traversal of Binary Tree
    • โญDiagonal Traversal
    • Cousins in Binary Tree
    • Path to Given Node
    • Remove Half Nodes
    • Merge two Binary Tree
    • โญBurn a Tree
    • Nodes at Distance K
    • Vertical Sum of a Binary Tree
    • Covered / Uncovered Nodes
  • 13 Dynamic Programming
    • Ugly Number II
    • Coin Change
    • 0 - 1 Knapsack Problem
    • Permutation Coefficient
  • 14 Greedy Algorithm
    • โญGas Station
    • โญMajority Element
    • โญDistribute Candy
    • โญHighest Product
    • Assign Mice to Holes
    • โญMeeting rooms
  • ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ15 Graph
    • Clone Graph
    • Word Search Board
    • โญStepping Numbers
    • Black Shapes
    • Knight On Chess Board
    • โŒSmallest Multiple With 0 and 1
    • โญCommutable Islands
    • Possibility of finishing all courses given pre-requisites
    • โŒValid Path
    • Cycle in Directed Graph
    • โŒCycle in Undirected Graph
Powered by GitBook
On this page
  1. 15 Graph

Clone Graph

PreviousMeeting roomsNextWord Search Board

Last updated 2 years ago

Using BFS

The main idea is to traverse each node using BFS and build its list of neighbours. The catch is to avoid rebuilding any node when it reappears as some other node's child while it has already been processed. If not avoided, this will result in an infinite loop.

/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
UndirectedGraphNode *Solution::cloneGraph(UndirectedGraphNode *node) {
    // if node is null then return
    if(!node) return nullptr;
    // Variaabl tot store the result. Initially stores the root's value.
    UndirectedGraphNode *g = new UndirectedGraphNode(node->label);
    // if same old node is repeated, we use the same corresponding new node
    // this can be used as a visited array too
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> oldToNewMap;
    // map old root to new root
    oldToNewMap[node] = g;
    // queue to perfrorm BFS. This will store the olds nodes
    // I will construct new nodes from this
    queue<UndirectedGraphNode *> q;
    q.push(node);
    
    // untill all the elements have been copied
    while(!q.empty()) {
        // take the first node. This is going to be an old node.
        UndirectedGraphNode *frontNode = q.front();
        // remove it from the queue
        q.pop();
        
        // the frontNode has its corresponding new node created. 
        // we need to fill the new node's neighbors based on the old node
        // get all the neighbors of the old node
        for(UndirectedGraphNode *neighbor: frontNode->neighbors) {
            // check if a corresponding new node have already been created for this neighbor
            if(!oldToNewMap[neighbor]) {
                // if this is the first encounter with this neighbor, then first create it. 
                oldToNewMap[neighbor] = new UndirectedGraphNode(neighbor->label);
                // push this new neighbor into the queue for further duplication
                q.push(neighbor);
            }
            
            // either this neighbour preexisted or was just created in the previous if statement
            // in both cases push it into the list of neighbours for the corresponding new frontNode
            oldToNewMap[frontNode]->neighbors.push_back(oldToNewMap[neighbor]);
        }
        // all the neighbor for this frontNode have been pushed into the neighbors list.
        // newly created ones are also in the queue while preexisting ones are excluded        
    }
    // eventually there will be no new nodes to be pushed into the queue and the while loop will exit
    // `g` is the new root node and can be safely returned
    return g;
}
Without Comments
UndirectedGraphNode *Solution::cloneGraph(UndirectedGraphNode *node) {
    if(!node) return nullptr;
    
    UndirectedGraphNode *g = new UndirectedGraphNode(node->label);
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> oldToNewMap;
    oldToNewMap[node] = g;
    
    queue<UndirectedGraphNode *> q;
    q.push(node);
    
    while(!q.empty()) {
        UndirectedGraphNode *frontNode = q.front();
        q.pop();
        
        for(UndirectedGraphNode *neighbor: frontNode->neighbors) {
            if(!oldToNewMap[neighbor]) {
                oldToNewMap[neighbor] = new UndirectedGraphNode(neighbor->label);
                q.push(neighbor);
            }
            
            oldToNewMap[frontNode]->neighbors.push_back(oldToNewMap[neighbor]);
        }
    }
    
    return g;
}

Time Complexity: O(N+E)O(N + E)O(N+E)โ€‹

Space Complexity: O(N+E)+O(N)+O(N)O(N + E) + O(N) + O(N)O(N+E)+O(N)+O(N)โ€‹ for BFS, queue and oldToNew mapping

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ
Clone Graph - InterviewBitInterviewBit
Logo