Symmetric Tree (Mirror Image of itself)

28 Jun, 2022
Given a binary tree, check whether it is a mirror of itself.
For example, this binary tree is symmetric: 
     1
   /   \
  2     2
 / \   / \
3   4 4   3

But the following is not:
    1
   / \
  2   2
   \   \
   3    3
The idea is to write a recursive function isMirror() that takes two trees as an argument and returns true if trees are the mirror and false if trees are not mirrored. The isMirror() function recursively checks two roots and subtrees under the root.
Below is the implementation of the above algorithm.
C++14
C
Java
Python3
C#
Javascript
// C++ program to check if a given Binary Tree is symmetric// or not#include <bits/stdc++.h>using namespace std; // A Binary Tree Nodestruct Node {    int key;    struct Node *left, *right;}; // Utility function to create new NodeNode* newNode(int key){    Node* temp = new Node;    temp->key = key;    temp->left = temp->right = NULL;    return (temp);} // Returns true if trees with roots as root1 and root2 are// mirrorbool isMirror(struct Node* root1, struct Node* root2){    // If both trees are empty, then they are mirror images    if (root1 == NULL && root2 == NULL)        return true;     // For two trees to be mirror images, the following    // three conditions must be true    // 1.) Their root node's key must be same    // 2.) left subtree of left tree and right subtree of    // right tree have to be mirror images    // 3.) right subtree of left tree and left subtree of    // right tree have to be mirror images    if (root1 && root2 && root1->key == root2->key)        return isMirror(root1->left, root2->right)               && isMirror(root1->right, root2->left);     // if none of above conditions is true then root1    // and root2 are not mirror images    return false;} // Returns true if a tree is symmetric i.e. mirror image of itselfbool isSymmetric(struct Node* root){    // Check if tree is mirror of itself    return isMirror(root, root);} // Driver codeint main(){    // Let us construct the Tree shown in the above figure    Node* root = newNode(1);    root->left = newNode(2);    root->right = newNode(2);    root->left->left = newNode(3);    root->left->right = newNode(4);    root->right->left = newNode(4);    root->right->right = newNode(3);     if (isSymmetric(root))        cout << "Symmetric";    else        cout << "Not symmetric";    return 0;} // This code is contributed by Sania Kumari Gupta
// C program to check if a given Binary Tree is symmetric// or not#include <stdbool.h>#include <stdio.h>#include <stdlib.h> // A Binary Tree Nodetypedef struct Node {    int key;    struct Node *left, *right;} Node; // Utility function to create new NodeNode* newNode(int key){    Node* temp = (Node *)malloc(sizeof(Node));    temp->key = key;    temp->left = temp->right = NULL;    return (temp);} // Returns true if trees with roots as root1 and root2 are// mirrorbool isMirror(Node* root1, Node* root2){    // If both trees are empty, then they are mirror images    if (root1 == NULL && root2 == NULL)        return true;     // For two trees to be mirror images, the following    // three conditions must be true    // 1.) Their root node's key must be same    // 2.) left subtree of left tree and right subtree of    // right tree have to be mirror images    // 3.) right subtree of left tree and left subtree of    // right tree have to be mirror images    if (root1 && root2 && root1->key == root2->key)        return isMirror(root1->left, root2->right)               && isMirror(root1->right, root2->left);     // if none of above conditions is true then root1    // and root2 are not mirror images    return false;} // Returns true if a tree is symmetric i.e. mirror image of// itselfbool isSymmetric(Node* root){    // Check if tree is mirror of itself    return isMirror(root, root);} // Driver codeint main(){    // Let us construct the Tree shown in the above figure    Node* root = newNode(1);    root->left = newNode(2);    root->right = newNode(2);    root->left->left = newNode(3);    root->left->right = newNode(4);    root->right->left = newNode(4);    root->right->right = newNode(3);     if (isSymmetric(root))        printf("Symmetric");    else        printf("Not symmetric");    return 0;} // This code is contributed by Sania Kumari Gupta
// Java program to check is binary tree is symmetric or notclass Node {    int key;    Node left, right;    Node(int item)    {        key = item;        left = right = null;    }} class BinaryTree {    Node root;     // returns true if trees with roots as root1 and    // root2 are mirror    boolean isMirror(Node node1, Node node2)    {        // if both trees are empty, then they are mirror image        if (node1 == null && node2 == null)            return true;         // For two trees to be mirror images, the following        // three conditions must be true        // 1.) Their root node's key must be same        // 2.) left subtree of left tree and right subtree        // of right tree have to be mirror images        // 3.) right subtree of left tree and left subtree        // of right tree have to be mirror images        if (node1 != null && node2 != null            && node1.key == node2.key)            return (isMirror(node1.left, node2.right)                    && isMirror(node1.right, node2.left));         // if none of the above conditions is true then        // root1 and root2 are not mirror images        return false;    }     // returns true if the tree is symmetric i.e    // mirror image of itself    boolean isSymmetric()    {        // check if tree is mirror of itself        return isMirror(root, root);    }     // Driver code    public static void main(String args[])    {        BinaryTree tree = new BinaryTree();        tree.root = new Node(1);        tree.root.left = new Node(2);        tree.root.right = new Node(2);        tree.root.left.left = new Node(3);        tree.root.left.right = new Node(4);        tree.root.right.left = new Node(4);        tree.root.right.right = new Node(3);        boolean output = tree.isSymmetric();        if (output == true)            System.out.println("Symmetric");        else            System.out.println("Not symmetric");    }} // This code is contributed by Sania Kumari Gupta
# Python program to check if a# given Binary Tree is symmetric or not # Node structure  class Node:     # Utility function to create new node    def __init__(self, key):        self.key = key        self.left = None        self.right = None # Returns True if trees#with roots as root1 and root 2  are mirror  def isMirror(root1, root2):    # If both trees are empty, then they are mirror images    if root1 is None and root2 is None:        return True     """ For two trees to be mirror images,        the following three conditions must be true        1 - Their root node's key must be same        2 - left subtree of left tree and right subtree          of the right tree have to be mirror images        3 - right subtree of left tree and left subtree           of right tree have to be mirror images    """    if (root1 is not None and root2 is not None):        if root1.key == root2.key:            return (isMirror(root1.left, root2.right)and                    isMirror(root1.right, root2.left))     # If none of the above conditions is true then root1    # and root2 are not mirror images    return False  def isSymmetric(root):     # Check if tree is mirror of itself    return isMirror(root, root)  # Driver Code# Let's construct the tree show in the above figureroot = Node(1)root.left = Node(2)root.right = Node(2)root.left.left = Node(3)root.left.right = Node(4)root.right.left = Node(4)root.right.right = Node(3)print ("Symmetric" if isSymmetric(root) == True else "Not symmetric") # This code is contributed by Nikhil Kumar Singh(nickzuck_007)
// C# program to check is binary// tree is symmetric or notusing System; class Node {    public int key;    public Node left, right;     public Node(int item)    {        key = item;        left = right = null;    }} class GFG {    Node root;     // returns true if trees with roots    // as root1 and root2 are mirror    Boolean isMirror(Node node1, Node node2)    {        // if both trees are empty,        // then they are mirror image        if (node1 == null && node2 == null)            return true;         // For two trees to be mirror images,        // the following three conditions must be true        // 1 - Their root node's key must be same        // 2 - left subtree of left tree and right        // subtree of right tree have to be mirror images        // 3 - right subtree of left tree and left subtree        // of right tree have to be mirror images        if (node1 != null && node2 != null            && node1.key == node2.key)            return (isMirror(node1.left, node2.right)                    && isMirror(node1.right, node2.left));         // if none of the above conditions        // is true then root1 and root2 are        // mirror images        return false;    }     // returns true if the tree is symmetric    // i.e mirror image of itself    Boolean isSymmetric()    {        // check if tree is mirror of itself        return isMirror(root, root);    }     // Driver Code    static public void Main(String[] args)    {        GFG tree = new GFG();        tree.root = new Node(1);        tree.root.left = new Node(2);        tree.root.right = new Node(2);        tree.root.left.left = new Node(3);        tree.root.left.right = new Node(4);        tree.root.right.left = new Node(4);        tree.root.right.right = new Node(3);        Boolean output = tree.isSymmetric();        if (output == true)            Console.WriteLine("Symmetric");        else            Console.WriteLine("Not symmetric");    }} // This code is contributed by Arnab Kundu
<script> // Javascript program to check is binary// tree is symmetric or not class Node {   constructor(item)  {    this.key = item;    this.left = null;    this.right = null;  }} var root = null; // returns true if trees with roots// as root1 and root2 are mirrorfunction isMirror(node1, node2){    // if both trees are empty,    // then they are mirror image    if (node1 == null && node2 == null)        return true;             // For two trees to be mirror images,    // the following three conditions must be true    // 1 - Their root node's key must be same    // 2 - left subtree of left tree and right    // subtree of right tree have to be mirror images    // 3 - right subtree of left tree and left subtree    // of right tree have to be mirror images    if (node1 != null && node2 != null        && node1.key == node2.key)        return (isMirror(node1.left, node2.right)                && isMirror(node1.right, node2.left));                     // if none of the above conditions    // is true then root1 and root2 are    // mirror images    return false;} // returns true if the tree is symmetric// i.e mirror image of itselffunction isSymmetric(){     // check if tree is mirror of itself    return isMirror(root, root);} // Driver Coderoot = new Node(1);root.left = new Node(2);root.right = new Node(2);root.left.left = new Node(3);root.left.right = new Node(4);root.right.left = new Node(4);root.right.right = new Node(3);var output = isSymmetric();if (output == true)    document.write("Symmetric");else    document.write("Not symmetric"); // This code is contributed by rrrtnx.</script>
Symmetric
Time Complexity: O(N)Auxiliary Space: O(h) where h is the maximum height of the tree
andrew1234
ShubhamDubey7
ehabnegm2002
rohitsingh07052
AakashYadav4
rrrtnx
vsachdeva4859
amartyaghoshgfg
krisania804
hardikkoriintern
Amazon
Tree
Amazon
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.