Check given binary tree is mirror or symmetric tree (Java/ recursive /example)

  • Given two binary trees, check whether one binary tree is mirror/symmetric of another binary tree.
  • Binary tree and corresponding mirror (image) binary tree are shown in Fig 1.
mirror image binary tree
Fig 1: Mirror binary tree

Algorithm – check one binary tree is mirror of another tree (recursive).

  1. Check If both input trees (tree1 & tree2) are null
    • Successfully traversed binary trees, return true.
  2. If any of the input trees is null
    • tree1 is not mirror of other tree2, return false.
  3. Evaluate the Current Node
  4. Compare the data of binary trees, tree1 & tree2
    • If Data is same for both nodes [Success condition]
      • Traverse Left child of tree1 and right child of tree2.
      • Traverse right child of tree1 and left child of tree2.
    • else, data of both nodes are not same
      • Trees are not mirror trees, return false.
  5. At end of traversal, we will know whether one tree is mirror of another tree.
symmetric binary tree
Fig 2: Mirror binary tree

Program : check binary trees are mirror image of each other using java

1.) IsMirrorTree Class:

  • IsMirrorTree class is used to check one binary tree is mirror of another binary tree.
  • Traverse the binary tree using recursive algorithm.
package org.learn.Question;
 
import java.util.LinkedList;
import java.util.Queue;
 
public class IsMirrorTree {
    public static boolean isMirrorTree(Node tree, Node mirrorTree) {
        if( null == tree && null == mirrorTree)
            return true;
         
        if( null == tree || null == mirrorTree)
            return false;
         
        if(tree.data != mirrorTree.data)
            return false;
         
        if(false == isMirrorTree(tree.left,mirrorTree.right))
            return false;
         
        if(false ==  isMirrorTree(tree.right,mirrorTree.left))
            return false;
         
        return true;
    }
     
    public static void printTree(Node root) {
        if (root == null) {
            System.out.println("Tree is empty");
            return ;
        }
        Queue<Node> queue = new LinkedList<Node>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            Node node = queue.poll();          
            System.out.printf("%d ",node.data);    
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        System.out.println("");
        return;
    }
}

2.) Node:

  • Node class representing the nodes in a binary tree.
package org.learn.Question;
 
public class Node {
    public int data;
    public Node left;
    public Node right;
 
    public Node(int num) {
        this.data = num;
        this.left = null;
        this.right = null;
    }
 
    public Node() {
        this.left = null;
        this.right = null;
    }
     
    public static Node createNode(int number) {
        return new Node(number);
    }
}

3.) App Class:

  • We are the creating binary tree in main method.
  • We are calling IsMirrorTree class, to check one binary tree is mirror  of another binary tree.
package org.learn.Client;
 
import org.learn.Question.IsMirrorTree;
import org.learn.Question.Node;
 
public class App {
    public static void main(String[] args) {
        // Binary Tree 1:
        // root level 0
        Node A = Node.createNode(70);
        // Level 1
        Node B = Node.createNode(50);
        Node C = Node.createNode(55);
        // Level 2
        Node D = Node.createNode(25);
        Node E = Node.createNode(80);
        Node F = Node.createNode(37);
        Node G = Node.createNode(45);
 
        // connect Level 0 and 1
        A.left = B;
        A.right = C;
        // connect level 1 and level 2
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
 
        //Binary Tree 2:
         
        // root level 0
        Node P = Node.createNode(70);
        // Level 1
        Node Q = Node.createNode(55);
        Node R = Node.createNode(50);
        // Level 2
        Node S = Node.createNode(45);
        Node T = Node.createNode(37);
        Node U = Node.createNode(80);
        Node V = Node.createNode(25);
 
        // connect Level 0 and 1
        P.left = Q;
        P.right = R;
        // connect level 1 and level 2
        Q.left  = S;
        Q.right = T;
        R.left  = U;
        R.right = V;
 
        System.out.println("Binary Tree 1 :");
        IsMirrorTree.printTree(A);
        System.out.println("Binary Tree 2 :");
        boolean isMirrorBinaryTrees = IsMirrorTree.isMirrorTree(A,P);
        System.out.printf("Check Trees are mirror binary tree : %b",isMirrorBinaryTrees);
    }
}

Output : check binary tree is symmetric of another binary tree using java

Binary Tree 1 :
70 50 55 25 80 37 45
Binary Tree 2 :
70 55 50 45 37 80 25
Check Trees are mirror binary tree : true

Download code – check trees are mirror binary tree using java