Find weather two given trees are isomorphic to each other or not.
Lets understand What is isomorphic strings
AAB and XXY are IsoMorphic to each other, consider A replaces/morphs as X and B as Y, then both strings are isomorphic.
ABC and XXY are not IsoMorphic.
In case of Trees Two binary trees A and B are isomorphic if they have the same shape means the values stored in the nodes do not affect whether two trees are isomorphic. Or its even called Quasi Isomorphic tree
(Mathematically we are discussing IsoMorphic rooted tree and not IsoMorphic Binary Tree, See at : https://www.slideshare.net/AnasAssayuti/nota-math-discrete-tree Slide 28 onwards
Write a method isIsomorphic that returns true if its two tree are isomorphic and false otherwise.
Here w’ll discuss both ways to find if a tree is isomorphic to each other or not, One is with data and one is without data match
- If ‘A’ Tree is structure wise mirror of other tree ‘B’ ( without its data values)
- If ‘A’ Tree is exactly mirror of other tree ‘B’ (with of its data values
Algorithm for 1.
- If any of the tree is null
- Trees are not quasi isomorphic & return false
- Check both trees tree1 and tree2
- if tree1 and tree2 are null, traversal completed successfully.
return true
- if tree1 and tree2 are null, traversal completed successfully.
- Traverse Left subtree of tree1 and left subtree of tree2
- Traverse Right subtree of tree1 and right subtree of tree2
- If structures are identical, then return true
- If trees are not identical, let us check one tree (or subtree) are mirror of other tree (subtree)
- Traverse Left subtree of tree1 and right subtree of tree2
- Traverse Right subtree of tree1 and left subtree of tree2
- If structures are mirror structure, then return true
- Else, return false
Sudo Code for 1&2.
bool isomorphic(struct treenode *treeone, struct treenode *treetwo) { //if both tree null if (!treeone && !treetwo) return true; // if one is null if((!treeone || !treetwo)) return false; // in case you want to check Data (case 2) if(treeone-data != treetwo->data) return false; return ( (isomorphic(treeone->left, treetwo->left) && isomorphic(treeone->right, treetwo->right)) || (isomorphic(treeone->left, treetwo->right) && isomorphic(treeone->right, treetwo->left)) ); }
Working Code
// A C++ program to check if two given trees are isomorphic by gohired.in #include <iostream> using namespace std; struct node { int data; struct node* left; struct node* right; }; bool isIsomorphic(node *treeone, node *treetwo) { if (!treeone && !treetwo) return true; if((!treeone || !treetwo)) return false; return ( isIsomorphic(treeone->left, treetwo->right) && isIsomorphic(treeone->right, treetwo->left) || isIsomorphic(treeone->left, treetwo->left) && isIsomorphic(treeone->right, treetwo->right) ); } node* newNode(int data) { node* temp = new node; temp->data = data; temp->left = NULL; temp->right = NULL; return (temp); } int main() { struct node *n1 = newNode(1); n1->left = newNode(2); n1->right = newNode(3); n1->left->left = newNode(4); n1->left->right = newNode(5); n1->right->left = newNode(6); n1->left->right->left = newNode(7); n1->left->right->right = newNode(8); struct node *n2 = newNode(1); n2->left = newNode(3); n2->right = newNode(2); n2->right->left = newNode(4); n2->right->right = newNode(5); n2->left->right = newNode(6); n2->right->right->left = newNode(8); n2->right->right->right = newNode(9); if (isIsomorphic(n1, n2) == true) cout << "Yes"; else cout << "No"; return 0; }