Problem
Write a method that takes a pointer to a Node structure as a parameter and returns a complete copy of the passed-in data structure. The Node structure contains two pointers to other Node structures.Solution
The algorithm will maintain a mapping from a node address in the original structure to the corresponding node in the new structure. This mapping will allow us to discover previously copied nodes during a traditional depth first traversal of the structure. (Traversals often mark visited nodes--the mark can take many forms and does not necessarily need to be stored in the node.) Thus, we have a simple recursive algorithm:
struct Node { Node * ptr1; Node * ptr2; }; typedef map<Node*, Node*> RecordMap; Node * recursive_copy(Node * root, RecordMap & mapping) { if(root == NULL) return root; RecordMap::iterator i = mapping.find(root); if(i != mapping.end()) // we’ve been here before, return the copy return mapping[root]; else { Node * node = new Node; mapping[root] = node; // map current node node -> ptr1 = recursive_copy(root -> ptr1, mapping); node -> ptr2 = recursive_copy(root -> ptr2, mapping); return node; } } Node * copy_structure(Node * root) { RecordMap mapping; // we will need an empty map return recursive_copy(root, mapping); }
References
http://tianrunhe.wordpress.com/2012/04/14/deep-copy-structure-of-pointers-in-c/
http://stackoverflow.com/questions/7681174/interview-coding-take-a-pointer-to-a-node-structure-as-a-parameter-and-return
0 comments:
Post a Comment