Skip to content

Commit d4700fd

Browse files
Merge pull request codemistic#479 from Aman5989/patch-18
create clone-a-Binary-tree-with-random-pointer.cpp
2 parents a8a8958 + 3a26b09 commit d4700fd

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// A hashmap based C++ program to clone a binary
2+
// tree with random pointers
3+
#include<iostream>
4+
#include<unordered_map>
5+
using namespace std;
6+
7+
/* A binary tree node has data, pointer to left child,
8+
a pointer to right child and a pointer to
9+
random node*/
10+
struct Node
11+
{
12+
int key;
13+
struct Node* left, *right, *random;
14+
};
15+
16+
/* Helper function that allocates a new Node with the
17+
given data and NULL left, right and random pointers. */
18+
Node* newNode(int key)
19+
{
20+
Node* temp = new Node;
21+
temp->key = key;
22+
temp->random = temp->right = temp->left = NULL;
23+
return (temp);
24+
}
25+
26+
/* Given a binary tree, print its Nodes in inorder*/
27+
void printInorder(Node* node)
28+
{
29+
if (node == NULL)
30+
return;
31+
32+
/* First recur on left subtree */
33+
printInorder(node->left);
34+
35+
/* then print data of Node and its random */
36+
cout << "[" << node->key << " ";
37+
if (node->random == NULL)
38+
cout << "NULL], ";
39+
else
40+
cout << node->random->key << "], ";
41+
42+
/* now recur on right subtree */
43+
printInorder(node->right);
44+
}
45+
46+
/* This function creates clone by copying key
47+
and left and right pointers. This function also
48+
stores mapping from given tree node to clone. */
49+
Node* copyLeftRightNode(Node* treeNode, unordered_map<Node *, Node *> &mymap)
50+
{
51+
if (treeNode == NULL)
52+
return NULL;
53+
Node* cloneNode = newNode(treeNode->key);
54+
mymap[treeNode] = cloneNode;
55+
cloneNode->left = copyLeftRightNode(treeNode->left, mymap);
56+
cloneNode->right = copyLeftRightNode(treeNode->right, mymap);
57+
return cloneNode;
58+
}
59+
60+
// This function copies random node by using the hashmap built by
61+
// copyLeftRightNode()
62+
void copyRandom(Node* treeNode, Node* cloneNode, unordered_map<Node *, Node *> &mymap)
63+
{
64+
if (cloneNode == NULL)
65+
return;
66+
cloneNode->random = mymap[treeNode->random];
67+
copyRandom(treeNode->left, cloneNode->left, mymap);
68+
copyRandom(treeNode->right, cloneNode->right, mymap);
69+
}
70+
71+
// This function makes the clone of given tree. It mainly uses
72+
// copyLeftRightNode() and copyRandom()
73+
Node* cloneTree(Node* tree)
74+
{
75+
if (tree == NULL)
76+
return NULL;
77+
unordered_map<Node *, Node *> mymap;
78+
Node* newTree = copyLeftRightNode(tree, mymap);
79+
copyRandom(tree, newTree, mymap);
80+
return newTree;
81+
}
82+
83+
/* Driver program to test above functions*/
84+
int main()
85+
{
86+
//Test No 1
87+
Node *tree = newNode(1);
88+
tree->left = newNode(2);
89+
tree->right = newNode(3);
90+
tree->left->left = newNode(4);
91+
tree->left->right = newNode(5);
92+
tree->random = tree->left->right;
93+
tree->left->left->random = tree;
94+
tree->left->right->random = tree->right;
95+
96+
// Test No 2
97+
// tree = NULL;
98+
99+
// Test No 3
100+
// tree = newNode(1);
101+
102+
// Test No 4
103+
/* tree = newNode(1);
104+
tree->left = newNode(2);
105+
tree->right = newNode(3);
106+
tree->random = tree->right;
107+
tree->left->random = tree;
108+
*/
109+
110+
cout << "Inorder traversal of original binary tree is: \n";
111+
printInorder(tree);
112+
113+
Node *clone = cloneTree(tree);
114+
115+
cout << "\n\nInorder traversal of cloned binary tree is: \n";
116+
printInorder(clone);
117+
118+
return 0;
119+
}

0 commit comments

Comments
 (0)