Posted on by Kalkicode
Code Binary Tree

Check if two trees are isomorphic or not

Two trees are isomorphic when tree node arrangement are mirror form. Our goal is to check given two trees are isomorphic or not. Example of isomorphic tree.

isomorphic tree

isomorphic tree is depend node values and depend on tree structure. Let see an example of non isomorphic trees.

non isomorphic trees

Here given code implementation process.

/*
    C program for
    Check if two trees are isomorphic 
*/
#include <stdio.h>

#include <stdlib.h>

// Tree Node
struct TreeNode
{
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
};
// Binary Tree
struct BinaryTree
{
    struct TreeNode *root;
};
// Create new tree
struct BinaryTree *newTree()
{
    // Create dynamic node
    struct BinaryTree *tree = (struct BinaryTree *) malloc(sizeof(struct BinaryTree));
    if (tree != NULL)
    {
        tree->root = NULL;
    }
    else
    {
        printf("Memory Overflow to Create tree Tree\n");
    }
    //return new tree
    return tree;
}
// This is creates and returns the new binary tree node
struct TreeNode *newNode(int data)
{
    // Create dynamic node
    struct TreeNode *new_node = 
      (struct TreeNode *) malloc(sizeof(struct TreeNode));
    if (new_node != NULL)
    {
        //Set data and pointer values
        new_node->data = data;
        new_node->left = NULL;
        new_node->right = NULL;
    }
    else
    {
        //This is indicates, 
        // segmentation fault or memory overflow problem
        printf("Memory Overflow\n");
        exit(0);
    }
    //return new node
    return new_node;
}
int isIsomorphic(struct TreeNode *t1, struct TreeNode *t2)
{
    if (t1 == NULL && t2 == NULL)
    {
        // When both t1 and t2 is null
        return 1;
    }
    if ((t1 == NULL || t2 == NULL) || (t1->data != t2->data))
    {
        // When one tree t1 or t2 node is empty or
        // t1 and t2 node value not similar
        return 0;
    }
    // When t1 and t2 tree are similar
    // Or t1 and t2 child are flipped to each other
    return (isIsomorphic(t1->left, t2->left) && isIsomorphic(t1->right, t2->right)) || (isIsomorphic(t1->left, t2->right) && isIsomorphic(t1->right, t2->left));
}
int main(int argc, char
    const *argv[])
{
    struct BinaryTree *tree1 = newTree();
    struct BinaryTree *tree2 = newTree();
    struct BinaryTree *tree3 = newTree();
    struct BinaryTree *tree4 = newTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1->root = newNode(1);
    tree1->root->left = newNode(2);
    tree1->root->right = newNode(7);
    tree1->root->right->right = newNode(8);
    tree1->root->left->right = newNode(3);
    tree1->root->left->left = newNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2->root = newNode(1);
    tree2->root->left = newNode(7);
    tree2->root->right = newNode(2);
    tree2->root->right->right = newNode(6);
    tree2->root->right->left = newNode(3);
    tree2->root->left->left = newNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3->root = newNode(1);
    tree3->root->left = newNode(7);
    tree3->root->right = newNode(9);
    tree3->root->right->right = newNode(6);
    tree3->root->right->left = newNode(3);
    tree3->root->left->left = newNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4->root = newNode(1);
    tree4->root->left = newNode(2);
    tree4->root->right = newNode(7);
    tree4->root->right->right = newNode(8);
    tree4->root->left->right = newNode(3);
    tree4->root->left->left = newNode(6);
    if (isIsomorphic(tree1->root, tree2->root) == 1)
    {
        printf("\n Tree1 and Tree2 is isomorphic");
    }
    else
    {
        printf("\n Tree1 and Tree2 is not isomorphic");
    }
    if (isIsomorphic(tree1->root, tree3->root) == 1)
    {
        printf("\n Tree1 and Tree3 is isomorphic");
    }
    else
    {
        printf("\n Tree1 and Tree3 is not isomorphic");
    }
    if (isIsomorphic(tree2->root, tree4->root) == 1)
    {
        printf("\n Tree2 and Tree4 is isomorphic");
    }
    else
    {
        printf("\n Tree2 and Tree4 is not isomorphic");
    }
    return 0;
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
/*
  Java program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        // Set node value
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
public class BinaryTree
{
    public TreeNode root;
    public BinaryTree()
    {
        // Set initial value
        this.root = null;
    }
    public boolean isIsomorphic(TreeNode t1, TreeNode t2)
    {
        if (t1 == null && t2 == null)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == null || t2 == null) || (t1.data != t2.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (isIsomorphic(t1.left, t2.left) && 
                isIsomorphic(t1.right, t2.right)) || 
              (isIsomorphic(t1.left, t2.right) && 
               isIsomorphic(t1.right, t2.left));
    }
    public static void main(String[] args)
    {
        BinaryTree tree1 = new BinaryTree();
        BinaryTree tree2 = new BinaryTree();
        BinaryTree tree3 = new BinaryTree();
        BinaryTree tree4 = new BinaryTree();
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree A
        */
        tree1.root = new TreeNode(1);
        tree1.root.left = new TreeNode(2);
        tree1.root.right = new TreeNode(7);
        tree1.root.right.right = new TreeNode(8);
        tree1.root.left.right = new TreeNode(3);
        tree1.root.left.left = new TreeNode(6);
        /*
                 1                            
               /   \    
              7     2    
             /     / \               
            8     3   6
            ------------
            Binary tree B
        */
        tree2.root = new TreeNode(1);
        tree2.root.left = new TreeNode(7);
        tree2.root.right = new TreeNode(2);
        tree2.root.right.right = new TreeNode(6);
        tree2.root.right.left = new TreeNode(3);
        tree2.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              7     9    
             /     / \               
            8     3   6
            ------------
            Binary tree C
        */
        tree3.root = new TreeNode(1);
        tree3.root.left = new TreeNode(7);
        tree3.root.right = new TreeNode(9);
        tree3.root.right.right = new TreeNode(6);
        tree3.root.right.left = new TreeNode(3);
        tree3.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree D
        */
        tree4.root = new TreeNode(1);
        tree4.root.left = new TreeNode(2);
        tree4.root.right = new TreeNode(7);
        tree4.root.right.right = new TreeNode(8);
        tree4.root.left.right = new TreeNode(3);
        tree4.root.left.left = new TreeNode(6);
        if (tree1.isIsomorphic(tree1.root, tree2.root))
        {
            System.out.print("\n Tree1 and Tree2 is isomorphic");
        }
        else
        {
            System.out.print("\n Tree1 and Tree2 is not isomorphic");
        }
        if (tree1.isIsomorphic(tree1.root, tree3.root))
        {
            System.out.print("\n Tree1 and Tree3 is isomorphic");
        }
        else
        {
            System.out.print("\n Tree1 and Tree3 is not isomorphic");
        }
        if (tree2.isIsomorphic(tree2.root, tree4.root))
        {
            System.out.print("\n Tree2 and Tree4 is isomorphic");
        }
        else
        {
            System.out.print("\n Tree2 and Tree4 is not isomorphic");
        }
    }
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
// Include header file
#include <iostream>
using namespace std;
/*
  C++ program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    public: 
    int data;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int data)
    {
        // Set node value
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};
class BinaryTree
{
    public: 
    TreeNode *root;
    BinaryTree()
    {
        this->root = NULL;
    }
    bool isIsomorphic(TreeNode *t1, TreeNode *t2)
    {
        if (t1 == NULL && t2 == NULL)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == NULL || t2 == NULL) || (t1->data != t2->data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (this->isIsomorphic(t1->left, t2->left) && 
                this->isIsomorphic(t1->right, t2->right)) || 
               (this->isIsomorphic(t1->left, t2->right) && 
                this->isIsomorphic(t1->right, t2->left));
    }
};
int main()
{
    BinaryTree *tree1 = new BinaryTree();
    BinaryTree *tree2 = new BinaryTree();
    BinaryTree *tree3 = new BinaryTree();
    BinaryTree *tree4 = new BinaryTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1->root = new TreeNode(1);
    tree1->root->left = new TreeNode(2);
    tree1->root->right = new TreeNode(7);
    tree1->root->right->right = new TreeNode(8);
    tree1->root->left->right = new TreeNode(3);
    tree1->root->left->left = new TreeNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2->root = new TreeNode(1);
    tree2->root->left = new TreeNode(7);
    tree2->root->right = new TreeNode(2);
    tree2->root->right->right = new TreeNode(6);
    tree2->root->right->left = new TreeNode(3);
    tree2->root->left->left = new TreeNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3->root = new TreeNode(1);
    tree3->root->left = new TreeNode(7);
    tree3->root->right = new TreeNode(9);
    tree3->root->right->right = new TreeNode(6);
    tree3->root->right->left = new TreeNode(3);
    tree3->root->left->left = new TreeNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4->root = new TreeNode(1);
    tree4->root->left = new TreeNode(2);
    tree4->root->right = new TreeNode(7);
    tree4->root->right->right = new TreeNode(8);
    tree4->root->left->right = new TreeNode(3);
    tree4->root->left->left = new TreeNode(6);
    if (tree1->isIsomorphic(tree1->root, tree2->root))
    {
        cout << "\n Tree1 and Tree2 is isomorphic";
    }
    else
    {
        cout << "\n Tree1 and Tree2 is not isomorphic";
    }
    if (tree1->isIsomorphic(tree1->root, tree3->root))
    {
        cout << "\n Tree1 and Tree3 is isomorphic";
    }
    else
    {
        cout << "\n Tree1 and Tree3 is not isomorphic";
    }
    if (tree2->isIsomorphic(tree2->root, tree4->root))
    {
        cout << "\n Tree2 and Tree4 is isomorphic";
    }
    else
    {
        cout << "\n Tree2 and Tree4 is not isomorphic";
    }
    return 0;
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
// Include namespace system
using System;
/*
  Csharp program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
public class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        // Set node value
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
public class BinaryTree
{
    public TreeNode root;
    public BinaryTree()
    {
        // Set initial value
        this.root = null;
    }
    public Boolean isIsomorphic(TreeNode t1, TreeNode t2)
    {
        if (t1 == null && t2 == null)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == null || t2 == null) || (t1.data != t2.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (this.isIsomorphic(t1.left, t2.left) && 
                this.isIsomorphic(t1.right, t2.right)) || 
              (this.isIsomorphic(t1.left, t2.right) && 
               this.isIsomorphic(t1.right, t2.left));
    }
    public static void Main(String[] args)
    {
        BinaryTree tree1 = new BinaryTree();
        BinaryTree tree2 = new BinaryTree();
        BinaryTree tree3 = new BinaryTree();
        BinaryTree tree4 = new BinaryTree();
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree A
        */
        tree1.root = new TreeNode(1);
        tree1.root.left = new TreeNode(2);
        tree1.root.right = new TreeNode(7);
        tree1.root.right.right = new TreeNode(8);
        tree1.root.left.right = new TreeNode(3);
        tree1.root.left.left = new TreeNode(6);
        /*
                 1                            
               /   \    
              7     2    
             /     / \               
            8     3   6
            ------------
            Binary tree B
        */
        tree2.root = new TreeNode(1);
        tree2.root.left = new TreeNode(7);
        tree2.root.right = new TreeNode(2);
        tree2.root.right.right = new TreeNode(6);
        tree2.root.right.left = new TreeNode(3);
        tree2.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              7     9    
             /     / \               
            8     3   6
            ------------
            Binary tree C
        */
        tree3.root = new TreeNode(1);
        tree3.root.left = new TreeNode(7);
        tree3.root.right = new TreeNode(9);
        tree3.root.right.right = new TreeNode(6);
        tree3.root.right.left = new TreeNode(3);
        tree3.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree D
        */
        tree4.root = new TreeNode(1);
        tree4.root.left = new TreeNode(2);
        tree4.root.right = new TreeNode(7);
        tree4.root.right.right = new TreeNode(8);
        tree4.root.left.right = new TreeNode(3);
        tree4.root.left.left = new TreeNode(6);
        if (tree1.isIsomorphic(tree1.root, tree2.root))
        {
            Console.Write("\n Tree1 and Tree2 is isomorphic");
        }
        else
        {
            Console.Write("\n Tree1 and Tree2 is not isomorphic");
        }
        if (tree1.isIsomorphic(tree1.root, tree3.root))
        {
            Console.Write("\n Tree1 and Tree3 is isomorphic");
        }
        else
        {
            Console.Write("\n Tree1 and Tree3 is not isomorphic");
        }
        if (tree2.isIsomorphic(tree2.root, tree4.root))
        {
            Console.Write("\n Tree2 and Tree4 is isomorphic");
        }
        else
        {
            Console.Write("\n Tree2 and Tree4 is not isomorphic");
        }
    }
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
package main
import "fmt"
/*
  Go program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
type TreeNode struct {
    data int
    left * TreeNode
    right * TreeNode
}
func getTreeNode(data int) * TreeNode {
    var me *TreeNode = &TreeNode {}
    // Set node value
    me.data = data
    me.left = nil
    me.right = nil
    return me
}
type BinaryTree struct {
    root * TreeNode
}
func getBinaryTree() * BinaryTree {
    var me *BinaryTree = &BinaryTree {}
    // Set initial value
    me.root = nil
    return me
}
func(this BinaryTree) isIsomorphic(t1, t2 *TreeNode) bool {
    if t1 == nil && t2 == nil {
        // When both t1 and t2 is null
        return true
    }
    if (t1 == nil || t2 == nil) || (t1.data != t2.data) {
        // When one tree t1 or t2 node is empty or
        // t1 and t2 node value not similar
        return false
    }
    // When t1 and t2 tree are similar
    // Or t1 and t2 child are flipped to each other
    return (this.isIsomorphic(t1.left, t2.left) && this.isIsomorphic(t1.right, t2.right)) || (this.isIsomorphic(t1.left, t2.right) && this.isIsomorphic(t1.right, t2.left))
}
func main() {
    var tree1 * BinaryTree = getBinaryTree()
    var tree2 * BinaryTree = getBinaryTree()
    var tree3 * BinaryTree = getBinaryTree()
    var tree4 * BinaryTree = getBinaryTree()
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1.root = getTreeNode(1)
    tree1.root.left = getTreeNode(2)
    tree1.root.right = getTreeNode(7)
    tree1.root.right.right = getTreeNode(8)
    tree1.root.left.right = getTreeNode(3)
    tree1.root.left.left = getTreeNode(6)
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2.root = getTreeNode(1)
    tree2.root.left = getTreeNode(7)
    tree2.root.right = getTreeNode(2)
    tree2.root.right.right = getTreeNode(6)
    tree2.root.right.left = getTreeNode(3)
    tree2.root.left.left = getTreeNode(8)
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3.root = getTreeNode(1)
    tree3.root.left = getTreeNode(7)
    tree3.root.right = getTreeNode(9)
    tree3.root.right.right = getTreeNode(6)
    tree3.root.right.left = getTreeNode(3)
    tree3.root.left.left = getTreeNode(8)
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4.root = getTreeNode(1)
    tree4.root.left = getTreeNode(2)
    tree4.root.right = getTreeNode(7)
    tree4.root.right.right = getTreeNode(8)
    tree4.root.left.right = getTreeNode(3)
    tree4.root.left.left = getTreeNode(6)
    if tree1.isIsomorphic(tree1.root, tree2.root) {
        fmt.Print("\n Tree1 and Tree2 is isomorphic")
    } else {
        fmt.Print("\n Tree1 and Tree2 is not isomorphic")
    }
    if tree1.isIsomorphic(tree1.root, tree3.root) {
        fmt.Print("\n Tree1 and Tree3 is isomorphic")
    } else {
        fmt.Print("\n Tree1 and Tree3 is not isomorphic")
    }
    if tree2.isIsomorphic(tree2.root, tree4.root) {
        fmt.Print("\n Tree2 and Tree4 is isomorphic")
    } else {
        fmt.Print("\n Tree2 and Tree4 is not isomorphic")
    }
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
<?php
/*
  Php program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    public $data;
    public $left;
    public $right;
    public  function __construct($data)
    {
        // Set node value
        $this->data = $data;
        $this->left = NULL;
        $this->right = NULL;
    }
}
class BinaryTree
{
    public $root;
    public  function __construct()
    {
        $this->root = NULL;
    }
    public  function isIsomorphic($t1, $t2)
    {
        if ($t1 == NULL && $t2 == NULL)
        {
            // When both t1 and t2 is null
            return true;
        }
        if (($t1 == NULL || $t2 == NULL) || ($t1->data != $t2->data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return ($this->isIsomorphic($t1->left, $t2->left) && 
                $this->isIsomorphic($t1->right, $t2->right)) || 
               ($this->isIsomorphic($t1->left, $t2->right) && 
                $this->isIsomorphic($t1->right, $t2->left));
    }
}

function main()
{
    $tree1 = new BinaryTree();
    $tree2 = new BinaryTree();
    $tree3 = new BinaryTree();
    $tree4 = new BinaryTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    $tree1->root = new TreeNode(1);
    $tree1->root->left = new TreeNode(2);
    $tree1->root->right = new TreeNode(7);
    $tree1->root->right->right = new TreeNode(8);
    $tree1->root->left->right = new TreeNode(3);
    $tree1->root->left->left = new TreeNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    $tree2->root = new TreeNode(1);
    $tree2->root->left = new TreeNode(7);
    $tree2->root->right = new TreeNode(2);
    $tree2->root->right->right = new TreeNode(6);
    $tree2->root->right->left = new TreeNode(3);
    $tree2->root->left->left = new TreeNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    $tree3->root = new TreeNode(1);
    $tree3->root->left = new TreeNode(7);
    $tree3->root->right = new TreeNode(9);
    $tree3->root->right->right = new TreeNode(6);
    $tree3->root->right->left = new TreeNode(3);
    $tree3->root->left->left = new TreeNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    $tree4->root = new TreeNode(1);
    $tree4->root->left = new TreeNode(2);
    $tree4->root->right = new TreeNode(7);
    $tree4->root->right->right = new TreeNode(8);
    $tree4->root->left->right = new TreeNode(3);
    $tree4->root->left->left = new TreeNode(6);
    if ($tree1->isIsomorphic($tree1->root, $tree2->root))
    {
        echo("\n Tree1 and Tree2 is isomorphic");
    }
    else
    {
        echo("\n Tree1 and Tree2 is not isomorphic");
    }
    if ($tree1->isIsomorphic($tree1->root, $tree3->root))
    {
        echo("\n Tree1 and Tree3 is isomorphic");
    }
    else
    {
        echo("\n Tree1 and Tree3 is not isomorphic");
    }
    if ($tree2->isIsomorphic($tree2->root, $tree4->root))
    {
        echo("\n Tree2 and Tree4 is isomorphic");
    }
    else
    {
        echo("\n Tree2 and Tree4 is not isomorphic");
    }
}
main();

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
/*
  Node JS program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    constructor(data)
    {
        // Set node value
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
class BinaryTree
{
    constructor()
    {
        this.root = null;
    }
    isIsomorphic(t1, t2)
    {
        if (t1 == null && t2 == null)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == null || t2 == null) || (t1.data != t2.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (this.isIsomorphic(t1.left, t2.left) && 
                this.isIsomorphic(t1.right, t2.right)) || 
              (this.isIsomorphic(t1.left, t2.right) && 
               this.isIsomorphic(t1.right, t2.left));
    }
}

function main()
{
    var tree1 = new BinaryTree();
    var tree2 = new BinaryTree();
    var tree3 = new BinaryTree();
    var tree4 = new BinaryTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1.root = new TreeNode(1);
    tree1.root.left = new TreeNode(2);
    tree1.root.right = new TreeNode(7);
    tree1.root.right.right = new TreeNode(8);
    tree1.root.left.right = new TreeNode(3);
    tree1.root.left.left = new TreeNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2.root = new TreeNode(1);
    tree2.root.left = new TreeNode(7);
    tree2.root.right = new TreeNode(2);
    tree2.root.right.right = new TreeNode(6);
    tree2.root.right.left = new TreeNode(3);
    tree2.root.left.left = new TreeNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3.root = new TreeNode(1);
    tree3.root.left = new TreeNode(7);
    tree3.root.right = new TreeNode(9);
    tree3.root.right.right = new TreeNode(6);
    tree3.root.right.left = new TreeNode(3);
    tree3.root.left.left = new TreeNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4.root = new TreeNode(1);
    tree4.root.left = new TreeNode(2);
    tree4.root.right = new TreeNode(7);
    tree4.root.right.right = new TreeNode(8);
    tree4.root.left.right = new TreeNode(3);
    tree4.root.left.left = new TreeNode(6);
    if (tree1.isIsomorphic(tree1.root, tree2.root))
    {
        process.stdout.write("\n Tree1 and Tree2 is isomorphic");
    }
    else
    {
        process.stdout.write("\n Tree1 and Tree2 is not isomorphic");
    }
    if (tree1.isIsomorphic(tree1.root, tree3.root))
    {
        process.stdout.write("\n Tree1 and Tree3 is isomorphic");
    }
    else
    {
        process.stdout.write("\n Tree1 and Tree3 is not isomorphic");
    }
    if (tree2.isIsomorphic(tree2.root, tree4.root))
    {
        process.stdout.write("\n Tree2 and Tree4 is isomorphic");
    }
    else
    {
        process.stdout.write("\n Tree2 and Tree4 is not isomorphic");
    }
}
main();

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
#  Python 3 program for
#  Check if two trees are isomorphic 

#  Binary Tree node
class TreeNode :
    def __init__(self, data) :
        #  Set node value
        self.data = data
        self.left = None
        self.right = None
    

class BinaryTree :
    def __init__(self) :
        self.root = None
    
    def isIsomorphic(self, t1, t2) :
        if (t1 == None and t2 == None) :
            #  When both t1 and t2 is null
            return True
        
        if ((t1 == None or t2 == None) or(t1.data != t2.data)) :
            #  When one tree t1 or t2 node is empty or
            #  t1 and t2 node value not similar
            return False
        
        #  When t1 and t2 tree are similar
        #  Or t1 and t2 child are flipped to each other
        return (self.isIsomorphic(t1.left, t2.left) and 
                self.isIsomorphic(t1.right, t2.right)) or (self.isIsomorphic(t1.left, t2.right) and 
                                                           self.isIsomorphic(t1.right, t2.left))
    

def main() :
    tree1 = BinaryTree()
    tree2 = BinaryTree()
    tree3 = BinaryTree()
    tree4 = BinaryTree()
    #         1                            
    #       /   \    
    #      2     7    
    #     / \     \               
    #    6   3     8
    #    ------------
    #    Binary tree A
    tree1.root = TreeNode(1)
    tree1.root.left = TreeNode(2)
    tree1.root.right = TreeNode(7)
    tree1.root.right.right = TreeNode(8)
    tree1.root.left.right = TreeNode(3)
    tree1.root.left.left = TreeNode(6)
    #         1                            
    #       /   \    
    #      7     2    
    #     /     / \               
    #    8     3   6
    #    ------------
    #    Binary tree B
    tree2.root = TreeNode(1)
    tree2.root.left = TreeNode(7)
    tree2.root.right = TreeNode(2)
    tree2.root.right.right = TreeNode(6)
    tree2.root.right.left = TreeNode(3)
    tree2.root.left.left = TreeNode(8)
    #         1                            
    #       /   \    
    #      7     9    
    #     /     / \               
    #    8     3   6
    #    ------------
    #    Binary tree C
    tree3.root = TreeNode(1)
    tree3.root.left = TreeNode(7)
    tree3.root.right = TreeNode(9)
    tree3.root.right.right = TreeNode(6)
    tree3.root.right.left = TreeNode(3)
    tree3.root.left.left = TreeNode(8)
    #         1                            
    #       /   \    
    #      2     7    
    #     / \     \               
    #    6   3     8
    #    ------------
    #    Binary tree D
    tree4.root = TreeNode(1)
    tree4.root.left = TreeNode(2)
    tree4.root.right = TreeNode(7)
    tree4.root.right.right = TreeNode(8)
    tree4.root.left.right = TreeNode(3)
    tree4.root.left.left = TreeNode(6)
    if (tree1.isIsomorphic(tree1.root, tree2.root)) :
        print("\n Tree1 and Tree2 is isomorphic", end = "")
    else :
        print("\n Tree1 and Tree2 is not isomorphic", end = "")
    
    if (tree1.isIsomorphic(tree1.root, tree3.root)) :
        print("\n Tree1 and Tree3 is isomorphic", end = "")
    else :
        print("\n Tree1 and Tree3 is not isomorphic", end = "")
    
    if (tree2.isIsomorphic(tree2.root, tree4.root)) :
        print("\n Tree2 and Tree4 is isomorphic", end = "")
    else :
        print("\n Tree2 and Tree4 is not isomorphic", end = "")
    

if __name__ == "__main__": main()

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
#  Ruby program for
#  Check if two trees are isomorphic 

#  Binary Tree node
class TreeNode 
    # Define the accessor and reader of class TreeNode
    attr_reader :data, :left, :right
    attr_accessor :data, :left, :right
    def initialize(data) 
        #  Set node value
        self.data = data
        self.left = nil
        self.right = nil
    end

end

class BinaryTree 
    # Define the accessor and reader of class BinaryTree
    attr_reader :root
    attr_accessor :root
    def initialize() 
        self.root = nil
    end

    def isIsomorphic(t1, t2) 
        if (t1 == nil && t2 == nil) 
            #  When both t1 and t2 is null
            return true
        end

        if ((t1 == nil || t2 == nil) || (t1.data != t2.data)) 
            #  When one tree t1 or t2 node is empty or
            #  t1 and t2 node value not similar
            return false
        end

        #  When t1 and t2 tree are similar
        #  Or t1 and t2 child are flipped to each other
        return (self.isIsomorphic(t1.left, t2.left) &&
                self.isIsomorphic(t1.right, t2.right)) || 
          (self.isIsomorphic(t1.left, t2.right) && 
           self.isIsomorphic(t1.right, t2.left))
    end

end

def main() 
    tree1 = BinaryTree.new()
    tree2 = BinaryTree.new()
    tree3 = BinaryTree.new()
    tree4 = BinaryTree.new()
    #         1                            
    #       /   \    
    #      2     7    
    #     / \     \               
    #    6   3     8
    #    ------------
    #    Binary tree A
    tree1.root = TreeNode.new(1)
    tree1.root.left = TreeNode.new(2)
    tree1.root.right = TreeNode.new(7)
    tree1.root.right.right = TreeNode.new(8)
    tree1.root.left.right = TreeNode.new(3)
    tree1.root.left.left = TreeNode.new(6)
    #         1                            
    #       /   \    
    #      7     2    
    #     /     / \               
    #    8     3   6
    #    ------------
    #    Binary tree B
    tree2.root = TreeNode.new(1)
    tree2.root.left = TreeNode.new(7)
    tree2.root.right = TreeNode.new(2)
    tree2.root.right.right = TreeNode.new(6)
    tree2.root.right.left = TreeNode.new(3)
    tree2.root.left.left = TreeNode.new(8)
    #         1                            
    #       /   \    
    #      7     9    
    #     /     / \               
    #    8     3   6
    #    ------------
    #    Binary tree C
    tree3.root = TreeNode.new(1)
    tree3.root.left = TreeNode.new(7)
    tree3.root.right = TreeNode.new(9)
    tree3.root.right.right = TreeNode.new(6)
    tree3.root.right.left = TreeNode.new(3)
    tree3.root.left.left = TreeNode.new(8)
    #         1                            
    #       /   \    
    #      2     7    
    #     / \     \               
    #    6   3     8
    #    ------------
    #    Binary tree D
    tree4.root = TreeNode.new(1)
    tree4.root.left = TreeNode.new(2)
    tree4.root.right = TreeNode.new(7)
    tree4.root.right.right = TreeNode.new(8)
    tree4.root.left.right = TreeNode.new(3)
    tree4.root.left.left = TreeNode.new(6)
    if (tree1.isIsomorphic(tree1.root, tree2.root)) 
        print("\n Tree1 and Tree2 is isomorphic")
    else
 
        print("\n Tree1 and Tree2 is not isomorphic")
    end

    if (tree1.isIsomorphic(tree1.root, tree3.root)) 
        print("\n Tree1 and Tree3 is isomorphic")
    else
 
        print("\n Tree1 and Tree3 is not isomorphic")
    end

    if (tree2.isIsomorphic(tree2.root, tree4.root)) 
        print("\n Tree2 and Tree4 is isomorphic")
    else
 
        print("\n Tree2 and Tree4 is not isomorphic")
    end

end

main()

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
/*
  Scala program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode(var data: Int,
    var left: TreeNode,
        var right: TreeNode)
{
    def this(data: Int)
    {
        // Set node value
        this(data, null, null);
    }
}
class BinaryTree(var root: TreeNode)
{
    def this()
    {
        this(null);
    }
    def isIsomorphic(t1: TreeNode, t2: TreeNode): Boolean = {
        if (t1 == null && t2 == null)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == null || t2 == null) || (t1.data != t2.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (isIsomorphic(t1.left, t2.left) && 
                isIsomorphic(t1.right, t2.right)) || 
          (isIsomorphic(t1.left, t2.right) && 
           isIsomorphic(t1.right, t2.left));
    }
}
object Main
{
    def main(args: Array[String]): Unit = {
        var tree1: BinaryTree = new BinaryTree();
        var tree2: BinaryTree = new BinaryTree();
        var tree3: BinaryTree = new BinaryTree();
        var tree4: BinaryTree = new BinaryTree();
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree A
        */
        tree1.root = new TreeNode(1);
        tree1.root.left = new TreeNode(2);
        tree1.root.right = new TreeNode(7);
        tree1.root.right.right = new TreeNode(8);
        tree1.root.left.right = new TreeNode(3);
        tree1.root.left.left = new TreeNode(6);
        /*
                 1                            
               /   \    
              7     2    
             /     / \               
            8     3   6
            ------------
            Binary tree B
        */
        tree2.root = new TreeNode(1);
        tree2.root.left = new TreeNode(7);
        tree2.root.right = new TreeNode(2);
        tree2.root.right.right = new TreeNode(6);
        tree2.root.right.left = new TreeNode(3);
        tree2.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              7     9    
             /     / \               
            8     3   6
            ------------
            Binary tree C
        */
        tree3.root = new TreeNode(1);
        tree3.root.left = new TreeNode(7);
        tree3.root.right = new TreeNode(9);
        tree3.root.right.right = new TreeNode(6);
        tree3.root.right.left = new TreeNode(3);
        tree3.root.left.left = new TreeNode(8);
        /*
                 1                            
               /   \    
              2     7    
             / \     \               
            6   3     8
            ------------
            Binary tree D
        */
        tree4.root = new TreeNode(1);
        tree4.root.left = new TreeNode(2);
        tree4.root.right = new TreeNode(7);
        tree4.root.right.right = new TreeNode(8);
        tree4.root.left.right = new TreeNode(3);
        tree4.root.left.left = new TreeNode(6);
        if (tree1.isIsomorphic(tree1.root, tree2.root))
        {
            print("\n Tree1 and Tree2 is isomorphic");
        }
        else
        {
            print("\n Tree1 and Tree2 is not isomorphic");
        }
        if (tree1.isIsomorphic(tree1.root, tree3.root))
        {
            print("\n Tree1 and Tree3 is isomorphic");
        }
        else
        {
            print("\n Tree1 and Tree3 is not isomorphic");
        }
        if (tree2.isIsomorphic(tree2.root, tree4.root))
        {
            print("\n Tree2 and Tree4 is isomorphic");
        }
        else
        {
            print("\n Tree2 and Tree4 is not isomorphic");
        }
    }
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
/*
  Swift 4 program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    var data: Int;
    var left: TreeNode? ;
    var right: TreeNode? ;
    init(_ data: Int)
    {
        // Set node value
        self.data = data;
        self.left = nil;
        self.right = nil;
    }
}
class BinaryTree
{
    var root: TreeNode? ;
    init()
    {
        self.root = nil;
    }
    func isIsomorphic(_ t1: TreeNode? , _ t2 : TreeNode? ) -> Bool
    {
        if (t1 == nil && t2 == nil)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == nil || t2 == nil) || (t1!.data  != t2!.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (self.isIsomorphic(t1!.left, t2!.left) && 
                self.isIsomorphic(t1!.right, t2!.right)) ||
          (self.isIsomorphic(t1!.left, t2!.right) && 
           self.isIsomorphic(t1!.right, t2!.left));
    }
}
func main()
{
    let tree1: BinaryTree = BinaryTree();
    let tree2: BinaryTree = BinaryTree();
    let tree3: BinaryTree = BinaryTree();
    let tree4: BinaryTree = BinaryTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1.root = TreeNode(1);
    tree1.root!.left = TreeNode(2);
    tree1.root!.right = TreeNode(7);
    tree1.root!.right!.right = TreeNode(8);
    tree1.root!.left!.right = TreeNode(3);
    tree1.root!.left!.left = TreeNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2.root = TreeNode(1);
    tree2.root!.left = TreeNode(7);
    tree2.root!.right = TreeNode(2);
    tree2.root!.right!.right = TreeNode(6);
    tree2.root!.right!.left = TreeNode(3);
    tree2.root!.left!.left = TreeNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3.root = TreeNode(1);
    tree3.root!.left = TreeNode(7);
    tree3.root!.right = TreeNode(9);
    tree3.root!.right!.right = TreeNode(6);
    tree3.root!.right!.left = TreeNode(3);
    tree3.root!.left!.left = TreeNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4.root = TreeNode(1);
    tree4.root!.left = TreeNode(2);
    tree4.root!.right = TreeNode(7);
    tree4.root!.right!.right = TreeNode(8);
    tree4.root!.left!.right = TreeNode(3);
    tree4.root!.left!.left = TreeNode(6);
    if (tree1.isIsomorphic(tree1.root, tree2.root))
    {
        print("\n Tree1 and Tree2 is isomorphic", terminator: "");
    }
    else
    {
        print("\n Tree1 and Tree2 is not isomorphic", terminator: "");
    }
    if (tree1.isIsomorphic(tree1.root, tree3.root))
    {
        print("\n Tree1 and Tree3 is isomorphic", terminator: "");
    }
    else
    {
        print("\n Tree1 and Tree3 is not isomorphic", terminator: "");
    }
    if (tree2.isIsomorphic(tree2.root, tree4.root))
    {
        print("\n Tree2 and Tree4 is isomorphic", terminator: "");
    }
    else
    {
        print("\n Tree2 and Tree4 is not isomorphic", terminator: "");
    }
}
main();

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic
/*
  Kotlin program for
  Check if two trees are isomorphic 
*/
// Binary Tree node
class TreeNode
{
    var data: Int;
    var left: TreeNode ? ;
    var right: TreeNode ? ;
    constructor(data: Int)
    {
        // Set node value
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
class BinaryTree
{
    var root: TreeNode ? ;
    constructor()
    {
        this.root = null;
    }
    fun isIsomorphic(t1: TreeNode ? , t2 : TreeNode ? ): Boolean
    {
        if (t1 == null && t2 == null)
        {
            // When both t1 and t2 is null
            return true;
        }
        if ((t1 == null || t2 == null) || (t1.data != t2.data))
        {
            // When one tree t1 or t2 node is empty or
            // t1 and t2 node value not similar
            return false;
        }
        // When t1 and t2 tree are similar
        // Or t1 and t2 child are flipped to each other
        return (this.isIsomorphic(t1.left, t2.left) &&
                this.isIsomorphic(t1.right, t2.right)) || 
          (this.isIsomorphic(t1.left, t2.right) && 
           this.isIsomorphic(t1.right, t2.left));
    }
}
fun main(args: Array < String > ): Unit
{
    val tree1: BinaryTree = BinaryTree();
    val tree2: BinaryTree = BinaryTree();
    val tree3: BinaryTree = BinaryTree();
    val tree4: BinaryTree = BinaryTree();
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree A
    */
    tree1.root = TreeNode(1);
    tree1.root?.left = TreeNode(2);
    tree1.root?.right = TreeNode(7);
    tree1.root?.right?.right = TreeNode(8);
    tree1.root?.left?.right = TreeNode(3);
    tree1.root?.left?.left = TreeNode(6);
    /*
             1                            
           /   \    
          7     2    
         /     / \               
        8     3   6
        ------------
        Binary tree B
    */
    tree2.root = TreeNode(1);
    tree2.root?.left = TreeNode(7);
    tree2.root?.right = TreeNode(2);
    tree2.root?.right?.right = TreeNode(6);
    tree2.root?.right?.left = TreeNode(3);
    tree2.root?.left?.left = TreeNode(8);
    /*
             1                            
           /   \    
          7     9    
         /     / \               
        8     3   6
        ------------
        Binary tree C
    */
    tree3.root = TreeNode(1);
    tree3.root?.left = TreeNode(7);
    tree3.root?.right = TreeNode(9);
    tree3.root?.right?.right = TreeNode(6);
    tree3.root?.right?.left = TreeNode(3);
    tree3.root?.left?.left = TreeNode(8);
    /*
             1                            
           /   \    
          2     7    
         / \     \               
        6   3     8
        ------------
        Binary tree D
    */
    tree4.root = TreeNode(1);
    tree4.root?.left = TreeNode(2);
    tree4.root?.right = TreeNode(7);
    tree4.root?.right?.right = TreeNode(8);
    tree4.root?.left?.right = TreeNode(3);
    tree4.root?.left?.left = TreeNode(6);
    if (tree1.isIsomorphic(tree1.root, tree2.root))
    {
        print("\n Tree1 and Tree2 is isomorphic");
    }
    else
    {
        print("\n Tree1 and Tree2 is not isomorphic");
    }
    if (tree1.isIsomorphic(tree1.root, tree3.root))
    {
        print("\n Tree1 and Tree3 is isomorphic");
    }
    else
    {
        print("\n Tree1 and Tree3 is not isomorphic");
    }
    if (tree2.isIsomorphic(tree2.root, tree4.root))
    {
        print("\n Tree2 and Tree4 is isomorphic");
    }
    else
    {
        print("\n Tree2 and Tree4 is not isomorphic");
    }
}

Output

 Tree1 and Tree2 is isomorphic
 Tree1 and Tree3 is not isomorphic
 Tree2 and Tree4 is isomorphic

Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment