Skip to main content

Check if all levels of two trees are anagrams or not

Here given code implementation process.

/*
    C Program 
    Check if all levels of two trees are anagrams or not
*/
#include <stdio.h>
#include <stdlib.h>


//Queue node
struct QueueNode
{
    int level;
    struct TreeNode *element;
    struct QueueNode *next;
};
// Define queue
struct MyQueue
{
   
    struct QueueNode*front;
    struct QueueNode*tail;

};

// Binary Tree node
struct TreeNode
{
    int data;
    struct TreeNode *left, *right;
};

struct BinaryTree
{
    struct TreeNode*root;
};

struct MyQueue* make_queue()
{

    // Create dynamic node of MyQueue
    struct MyQueue *node = (struct MyQueue *) malloc(sizeof(struct MyQueue));

    if(node==NULL)
    {
        printf("\nMemory Overflow, when creating a new Queue\n");
    }
    else
    {
        node->front = NULL;
        node->tail  = NULL;
    }
    return node;
}

struct BinaryTree* make_tree()
{

    // Create dynamic node of BinaryTree
    struct BinaryTree *node = (struct BinaryTree *) malloc(sizeof(struct BinaryTree));

    if(node==NULL)
    {
        printf("\nMemory Overflow, when creating a new BinaryTree\n");
    }
    else
    {
        node->root = NULL;
    }
    return node;
}
int is_empty(struct MyQueue*queue)
{
    if(queue == NULL || queue->front==NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

//Create a queue node and returns this node
void enqueue(struct MyQueue*queue , struct TreeNode *tree_node)
{
    //Make a new Queue node
    struct QueueNode *new_node = (struct QueueNode *) malloc(sizeof(struct QueueNode));

    if (new_node != NULL)
    {
        //Set node values
        new_node->element = tree_node;
        new_node->next    = NULL;

        if(queue->front==NULL)
        {
            queue->front = new_node;
        
            queue->tail  = queue->front;
        }
        else
        {
            queue->tail->next = new_node;

            queue->tail = new_node;
        }
    }
    else
    {
        printf("\nMemory Overflow, when creating a new Queue Node\n");
    }
 
}

//Remove a queue elements
void dequeue(struct MyQueue*queue)
{
    if ( is_empty(queue)==0)
    {
        struct QueueNode *remove = queue->front;

        if(queue->front==queue->tail)
        {
            queue->tail = NULL;
        }
        
        queue->front= queue->front->next;
        
        remove->element = NULL;
        remove->next = NULL;
        //free node
        free(remove);
        remove = NULL;
    }
}

// Return front element of queue
struct TreeNode* peek(struct MyQueue*queue)
{
    if(is_empty(queue)==1)
    {
        return NULL;
    }
    else
    {
        return queue->front->element;
    }
}
void inorder(struct TreeNode*node)
{
    if(node!=NULL)
    {

        inorder(node->left);
        printf("  %d",node->data);
        inorder(node->right);
    }
}
// Determine two trees are anagram or not 
void is_anagrams(struct TreeNode*tree1,struct TreeNode*tree2)
{

    //result indicators
    int status = 1;

    // Create queue variables
    struct MyQueue *queue1 = make_queue();

    struct MyQueue *queue2 = make_queue();


    // Add first node of queue
    enqueue(queue1,tree1);
    enqueue(queue2,tree2);


    // Define tree nodes
    struct TreeNode *node1 = NULL;
    struct TreeNode *node2 = NULL;

    //print tree elements
    printf("\n First Tree \n");
    inorder(tree1);
    printf("\n Second Tree \n");
    inorder(tree2);
    // 
    while(is_empty(queue1)==0 || is_empty(queue2)==0)
    {

        if(status==1)
        {
            // Get the front element of both queue 
            node1 = peek(queue1);
            node2 = peek(queue2);

         
            if( 
                (  node1  == NULL && node2 != NULL) 
                || (node1 != NULL && node2 == NULL) 
                || (node1 != NULL && node2 != NULL  && node1->data != node2->data))
            {
                //When both queue front node are not same (That is based on values or null nodes )
                status = 0;
            }
            else
            {
                if(node1->left != NULL)
                {

                    enqueue(queue1,node1->left);
                }
                if(node1->right != NULL)
                {
                    enqueue(queue1,node1->right);
                }
                
                if(node2->right!=NULL)
                {
                    enqueue(queue2,node2->right);
                }
                if(node2->left!=NULL)
                {
                    enqueue(queue2,node2->left);
                }

                dequeue(queue1);
                dequeue(queue2);
                
            }
        }
        else
        {
            if(is_empty(queue1)==0)
            {
                dequeue(queue1);
            }
            if(is_empty(queue2)==0)
            {
                dequeue(queue2);
            }
            status = 0;
        }

    }
   
    
    if(status==0)
    {
        printf("\n Anagram not exist \n");
    }
    else
    {
        printf("\n Anagram exist \n");
    }


}

//This is creating a binary tree node and return new node
struct TreeNode *get_tree_node(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("\nMemory Overflow, when creating a new Tree Node\n");
    }
    //return new node
    return new_node;
}


int main()
{
    struct BinaryTree*tree1= make_tree();
    struct BinaryTree*tree2= make_tree();
    struct BinaryTree*tree3= make_tree();
    /*
             8
           /   \
          7     4
         /     /  \
        3     9    2
             / \
            5   6   
    ------------------ 
    Constructing binary tree    
    */
    tree1->root = get_tree_node(8);
    tree1->root->left = get_tree_node(7);
    tree1->root->left->left = get_tree_node(3);
    tree1->root->right = get_tree_node(4);
    tree1->root->right->left = get_tree_node(9);
    tree1->root->right->right = get_tree_node(2);
    tree1->root->right->left->left = get_tree_node(5);
    tree1->root->right->left->right = get_tree_node(6);
    /*
             8
           /   \
          4     7
         /  \    \
        2    9    3
            / \
           6   5 
     ----------------- 
    Second Constructing binary tree 
    */

    tree2->root = get_tree_node(8);
    tree2->root->right = get_tree_node(7);
    tree2->root->right->right = get_tree_node(3);
    tree2->root->left = get_tree_node(4);
    tree2->root->left->right = get_tree_node(9);
    tree2->root->left->left = get_tree_node(2);
    tree2->root->left->right->right = get_tree_node(5);
    tree2->root->left->right->left = get_tree_node(6);

    /*
             8
           /   \
          4     7
         /  \    \
        2    6    3
              \
               9 
                \
                 5  
     ----------------- 
    Third Constructing binary tree 
    */

    tree3->root = get_tree_node(8);
    tree3->root->right = get_tree_node(7);
    tree3->root->right->right = get_tree_node(3);
    tree3->root->left = get_tree_node(4);
    tree3->root->left->right = get_tree_node(6);
    tree3->root->left->left = get_tree_node(2);
    tree3->root->left->right->right = get_tree_node(9);
    tree3->root->left->right->right->right = get_tree_node(5);

    // Test case
    is_anagrams(tree1->root,tree2->root);
    is_anagrams(tree2->root,tree3->root);
   
    return 0;
}

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
/*
    Java Program 
    Check if all levels of two trees are anagrams or not
*/
// 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;
    }
}

// Queue Node
class QueueNode
{
    public TreeNode element;
    public QueueNode next;
    public QueueNode(TreeNode element)
    {
        this.element = element;
        this.next = null;
      
    }
}
//Define custom queue class
class MyQueue
{
    public QueueNode front;
    public QueueNode tail;
    public MyQueue()
    {
        this.front = null;
        this.tail = null;
    }
    //Add a new node at last of queue
    public void enqueue(TreeNode element)
    {
        QueueNode new_node = new QueueNode(element);
        if (this.front == null)
        {
            //When first node of queue
            this.front = new_node;
        }
        else
        {
            //Add node at last position
            this.tail.next = new_node;
        }
        this.tail = new_node;
    }
    //Delete first node of queue
    public void dequeue()
    {
        if (this.front != null)
        {
            if (this.tail == this.front)
            {
                this.tail = null;
                this.front = null;
            }
            else
            {
                this.front = this.front.next;
            }
        }
    }

    public boolean is_empty()
    {
        if (this.front == null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public TreeNode peek()
    {
        if(is_empty()==false)
        {
            return this.front.element;
        }
        else
        {
            return null;
        }
    }
}
//Define Binary Tree 
public class BinaryTree
{
    public TreeNode root;
    public BinaryTree()
    {
        //Set root of tree
        this.root = null;
    }
    public void inorder(TreeNode node)
    {
        if(node!=null)
        {

            inorder(node.left);
            System.out.print("  "+node.data);
            inorder(node.right);
        }
    }
    // Determine two trees are anagram or not 
public void is_anagrams(TreeNode root2)
{
    //result indicators
    boolean status = true;
    // Create queue variables
    MyQueue queue1 = new MyQueue();
    MyQueue queue2 = new MyQueue();
    // Add first node of queue
    queue1.enqueue(this.root);
    queue2.enqueue(root2);
    // Define tree nodes
    TreeNode node1 = null;
    TreeNode node2 = null;
    //print tree elements
    System.out.print("\n First Tree \n");
    inorder(this.root);
    System.out.print("\n Second Tree \n");
    inorder(root2);
    // 
    while (queue1.is_empty() == false || queue2.is_empty() == false)
    {
        if (status == true)
        {
            // Get the front element of both queue 
            node1 = queue1.peek();
            node2 = queue2.peek();
            if ((node1 == null && node2 != null) || (node1 != null && node2 == null) || (node1 != null && node2 != null && node1.data != node2.data))
            {
                //When both queue front node are not same (That is based on values or null nodes )
                status = false;
            }
            else
            {
                if (node1.left != null)
                {
                    queue1.enqueue(node1.left);
                }
                if (node1.right != null)
                {
                    queue1.enqueue(node1.right);
                }
                if (node2.right != null)
                {
                    queue2.enqueue(node2.right);
                }
                if (node2.left != null)
                {
                    queue2.enqueue(node2.left);
                }
                queue1.dequeue();
                queue2.dequeue();
            }
        }
        else
        {
            if (queue1.is_empty() == false)
            {
                queue1.dequeue();
            }
            if (queue2.is_empty() == false)
            {
                queue2.dequeue();
            }
            status = false;
        }
    }
    if (status == false)
    {
        System.out.print("\n Anagram not exist \n");
    }
    else
    {
        System.out.print("\n Anagram exist \n");
    }
}

   
    public static void main(String[] args)
    {
       
        BinaryTree tree1 = new BinaryTree();
        BinaryTree tree2 = new BinaryTree();
        BinaryTree tree3 = new BinaryTree();
        /*
             8
           /   \
          7     4
         /     /  \
        3     9    2
             / \
            5   6   
        ------------------ 
        Constructing binary tree    
        */
        tree1.root = new TreeNode(8);
        tree1.root.left = new TreeNode(7);
        tree1.root.left.left = new TreeNode(3);
        tree1.root.right = new TreeNode(4);
        tree1.root.right.left = new TreeNode(9);
        tree1.root.right.right = new TreeNode(2);
        tree1.root.right.left.left = new TreeNode(5);
        tree1.root.right.left.right = new TreeNode(6);
        /*
             8
           /   \
          4     7
         /  \    \
        2    9    3
            / \
           6   5 
        ----------------- 
        Second Constructing binary tree 
        */
        tree2.root = new TreeNode(8);
        tree2.root.right = new TreeNode(7);
        tree2.root.right.right = new TreeNode(3);
        tree2.root.left = new TreeNode(4);
        tree2.root.left.right = new TreeNode(9);
        tree2.root.left.left = new TreeNode(2);
        tree2.root.left.right.right = new TreeNode(5);
        tree2.root.left.right.left = new TreeNode(6);
        /*
             8
           /   \
          4     7
         /  \    \
        2    6    3
              \
               9 
                \
                 5  
         ----------------- 
        Third Constructing binary tree 
        */
        tree3.root = new TreeNode(8);
        tree3.root.right = new TreeNode(7);
        tree3.root.right.right = new TreeNode(3);
        tree3.root.left = new TreeNode(4);
        tree3.root.left.right = new TreeNode(6);
        tree3.root.left.left = new TreeNode(2);
        tree3.root.left.right.right = new TreeNode(9);
        tree3.root.left.right.right.right = new TreeNode(5);
        //inorder(tree1->root);
        // Test case
        tree1.is_anagrams(tree2.root);
        tree2.is_anagrams(tree3.root);
    }
}

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
// Include header file
#include <iostream>
using namespace std;

/*
    C++ Program 
    Check if all levels of two trees are anagrams or not
*/

//  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;
	}
};
//  Queue Node
class QueueNode
{
	public: 
    TreeNode *element;
	QueueNode *next;
	QueueNode(TreeNode *element)
	{
		this->element = element;
		this->next = NULL;
	}
};
// Define custom queue class
class MyQueue
{
	public: QueueNode *front;
	QueueNode *tail;
	MyQueue()
	{
		this->front = NULL;
		this->tail = NULL;
	}
	// Add a new node at last of queue
	void enqueue(TreeNode *element)
	{
		QueueNode *new_node = new QueueNode(element);
		if (this->front == NULL)
		{
			// When first node of queue
			this->front = new_node;
		}
		else
		{
			// Add node at last position
			this->tail->next = new_node;
		}
		this->tail = new_node;
	}
	// Delete first node of queue
	void dequeue()
	{
		if (this->front != NULL)
		{
			if (this->tail == this->front)
			{
				this->tail = NULL;
				this->front = NULL;
			}
			else
			{
				this->front = this->front->next;
			}
		}
	}
	bool is_empty()
	{
		if (this->front == NULL)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	TreeNode *peek()
	{
		if (this->is_empty() == false)
		{
			return this->front->element;
		}
		else
		{
			return NULL;
		}
	}
};
// Define Binary Tree
class BinaryTree
{
	public: TreeNode *root;
	BinaryTree()
	{
		// Set root of tree
		this->root = NULL;
	}
	void inorder(TreeNode *node)
	{
		if (node != NULL)
		{
			this->inorder(node->left);
			cout << "  " << node->data;
			this->inorder(node->right);
		}
	}
	//  Determine two trees are anagram or not
	void is_anagrams(TreeNode *root2)
	{
		// result indicators
		bool status = true;
		//  Create queue variables
		MyQueue queue1 = MyQueue();
		MyQueue queue2 = MyQueue();
		//  Add first node of queue
		queue1.enqueue(this->root);
		queue2.enqueue(root2);
		//  Define tree nodes
		TreeNode *node1 = NULL;
		TreeNode *node2 = NULL;
		// print tree elements
		cout << "\n First Tree \n";
		this->inorder(this->root);
		cout << "\n Second Tree \n";
		this->inorder(root2);
		// 
		while (queue1.is_empty() == false || queue2.is_empty() == false)
		{
			if (status == true)
			{
				//  Get the front element of both queue
				node1 = queue1.peek();
				node2 = queue2.peek();
				if ((node1 == NULL && node2 != NULL) 
                    || (node1 != NULL && node2 == NULL) 
                    || (node1 != NULL && node2 != NULL && node1->data != node2->data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					status = false;
				}
				else
				{
					if (node1->left != NULL)
					{
						queue1.enqueue(node1->left);
					}
					if (node1->right != NULL)
					{
						queue1.enqueue(node1->right);
					}
					if (node2->right != NULL)
					{
						queue2.enqueue(node2->right);
					}
					if (node2->left != NULL)
					{
						queue2.enqueue(node2->left);
					}
					queue1.dequeue();
					queue2.dequeue();
				}
			}
			else
			{
				if (queue1.is_empty() == false)
				{
					queue1.dequeue();
				}
				if (queue2.is_empty() == false)
				{
					queue2.dequeue();
				}
				status = false;
			}
		}
		if (status == false)
		{
			cout << "\n Anagram not exist \n";
		}
		else
		{
			cout << "\n Anagram exist \n";
		}
	}
};
int main()
{
	BinaryTree tree1 = BinaryTree();
	BinaryTree tree2 = BinaryTree();
	BinaryTree *tree3 = new BinaryTree();
	/*
	             8
	           /   \
	          7     4
	         /     /  \
	        3     9    2
	             / \
	            5   6   
	        ------------------ 
	        Constructing binary tree    
	        */
	tree1.root = new TreeNode(8);
	tree1.root->left = new TreeNode(7);
	tree1.root->left->left = new TreeNode(3);
	tree1.root->right = new TreeNode(4);
	tree1.root->right->left = new TreeNode(9);
	tree1.root->right->right = new TreeNode(2);
	tree1.root->right->left->left = new TreeNode(5);
	tree1.root->right->left->right = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    9    3
	            / \
	           6   5 
	        ----------------- 
	        Second Constructing binary tree 
	        */
	tree2.root = new TreeNode(8);
	tree2.root->right = new TreeNode(7);
	tree2.root->right->right = new TreeNode(3);
	tree2.root->left = new TreeNode(4);
	tree2.root->left->right = new TreeNode(9);
	tree2.root->left->left = new TreeNode(2);
	tree2.root->left->right->right = new TreeNode(5);
	tree2.root->left->right->left = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    6    3
	              \
	               9 
	                \
	                 5  
	         ----------------- 
	        Third Constructing binary tree 
	        */
	tree3->root = new TreeNode(8);
	tree3->root->right = new TreeNode(7);
	tree3->root->right->right = new TreeNode(3);
	tree3->root->left = new TreeNode(4);
	tree3->root->left->right = new TreeNode(6);
	tree3->root->left->left = new TreeNode(2);
	tree3->root->left->right->right = new TreeNode(9);
	tree3->root->left->right->right->right = new TreeNode(5);
	// inorder(tree1->root);
	//  Test case
	tree1.is_anagrams(tree2.root);
	tree2.is_anagrams(tree3->root);
	return 0;
}

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
// Include namespace system
using System;

/*
    C# Program 
    Check if all levels of two trees are anagrams or not
*/

//  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;
	}
}
//  Queue Node
public class QueueNode
{
	public TreeNode element;
	public QueueNode next;
	public QueueNode(TreeNode element)
	{
		this.element = element;
		this.next = null;
	}
}
// Define custom queue class
public class MyQueue
{
	public QueueNode front;
	public QueueNode tail;
	public MyQueue()
	{
		this.front = null;
		this.tail = null;
	}
	// Add a new node at last of queue
	public void enqueue(TreeNode element)
	{
		QueueNode new_node = new QueueNode(element);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	public void dequeue()
	{
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	public Boolean is_empty()
	{
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	public TreeNode peek()
	{
		if (is_empty() == false)
		{
			return this.front.element;
		}
		else
		{
			return null;
		}
	}
}
// Define Binary Tree
public class BinaryTree
{
	public TreeNode root;
	public BinaryTree()
	{
		// Set root of tree
		this.root = null;
	}
	public void inorder(TreeNode node)
	{
		if (node != null)
		{
			inorder(node.left);
			Console.Write("  " + node.data);
			inorder(node.right);
		}
	}
	//  Determine two trees are anagram or not
	public void is_anagrams(TreeNode root2)
	{
		// result indicators
		Boolean status = true;
		//  Create queue variables
		MyQueue queue1 = new MyQueue();
		MyQueue queue2 = new MyQueue();
		//  Add first node of queue
		queue1.enqueue(this.root);
		queue2.enqueue(root2);
		//  Define tree nodes
		TreeNode node1 = null;
		TreeNode node2 = null;
		// print tree elements
		Console.Write("\n First Tree \n");
		inorder(this.root);
		Console.Write("\n Second Tree \n");
		inorder(root2);
		// 
		while (queue1.is_empty() == false || queue2.is_empty() == false)
		{
			if (status == true)
			{
				//  Get the front element of both queue
				node1 = queue1.peek();
				node2 = queue2.peek();
				if ((node1 == null && node2 != null) || (node1 != null && node2 == null) || (node1 != null && node2 != null && node1.data != node2.data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					status = false;
				}
				else
				{
					if (node1.left != null)
					{
						queue1.enqueue(node1.left);
					}
					if (node1.right != null)
					{
						queue1.enqueue(node1.right);
					}
					if (node2.right != null)
					{
						queue2.enqueue(node2.right);
					}
					if (node2.left != null)
					{
						queue2.enqueue(node2.left);
					}
					queue1.dequeue();
					queue2.dequeue();
				}
			}
			else
			{
				if (queue1.is_empty() == false)
				{
					queue1.dequeue();
				}
				if (queue2.is_empty() == false)
				{
					queue2.dequeue();
				}
				status = false;
			}
		}
		if (status == false)
		{
			Console.Write("\n Anagram not exist \n");
		}
		else
		{
			Console.Write("\n Anagram exist \n");
		}
	}
	public static void Main(String[] args)
	{
		BinaryTree tree1 = new BinaryTree();
		BinaryTree tree2 = new BinaryTree();
		BinaryTree tree3 = new BinaryTree();
		/*
		             8
		           /   \
		          7     4
		         /     /  \
		        3     9    2
		             / \
		            5   6   
		        ------------------ 
		        Constructing binary tree    
		        */
		tree1.root = new TreeNode(8);
		tree1.root.left = new TreeNode(7);
		tree1.root.left.left = new TreeNode(3);
		tree1.root.right = new TreeNode(4);
		tree1.root.right.left = new TreeNode(9);
		tree1.root.right.right = new TreeNode(2);
		tree1.root.right.left.left = new TreeNode(5);
		tree1.root.right.left.right = new TreeNode(6);
		/*
		             8
		           /   \
		          4     7
		         /  \    \
		        2    9    3
		            / \
		           6   5 
		        ----------------- 
		        Second Constructing binary tree 
		        */
		tree2.root = new TreeNode(8);
		tree2.root.right = new TreeNode(7);
		tree2.root.right.right = new TreeNode(3);
		tree2.root.left = new TreeNode(4);
		tree2.root.left.right = new TreeNode(9);
		tree2.root.left.left = new TreeNode(2);
		tree2.root.left.right.right = new TreeNode(5);
		tree2.root.left.right.left = new TreeNode(6);
		/*
		             8
		           /   \
		          4     7
		         /  \    \
		        2    6    3
		              \
		               9 
		                \
		                 5  
		         ----------------- 
		        Third Constructing binary tree 
		        */
		tree3.root = new TreeNode(8);
		tree3.root.right = new TreeNode(7);
		tree3.root.right.right = new TreeNode(3);
		tree3.root.left = new TreeNode(4);
		tree3.root.left.right = new TreeNode(6);
		tree3.root.left.left = new TreeNode(2);
		tree3.root.left.right.right = new TreeNode(9);
		tree3.root.left.right.right.right = new TreeNode(5);
		// inorder(tree1->root);
		//  Test case
		tree1.is_anagrams(tree2.root);
		tree2.is_anagrams(tree3.root);
	}
}

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
<?php
/*
    Php Program 
    Check if all levels of two trees are anagrams or not
*/
//  Binary Tree node
class TreeNode
{
	public $data;
	public $left;
	public $right;

	function __construct($data)
	{
		//  Set node value
		$this->data = $data;
		$this->left = null;
		$this->right = null;
	}
}
//  Queue Node
class QueueNode
{
	public $element;
	public $next;

	function __construct($element)
	{
		$this->element = $element;
		$this->next = null;
	}
}
// Define custom queue class
class MyQueue
{
	public $front;
	public $tail;

	function __construct()
	{
		$this->front = null;
		$this->tail = null;
	}
	// Add a new node at last of queue
	public	function enqueue($element)
	{
		$new_node = new QueueNode($element);
		if ($this->front == null)
		{
			// When first node of queue
			$this->front = $new_node;
		}
		else
		{
			// Add node at last position
			$this->tail->next = $new_node;
		}
		$this->tail = $new_node;
	}
	// Delete first node of queue
	public	function dequeue()
	{
		if ($this->front != null)
		{
			if ($this->tail == $this->front)
			{
				$this->tail = null;
				$this->front = null;
			}
			else
			{
				$this->front = $this->front->next;
			}
		}
	}
	public	function is_empty()
	{
		if ($this->front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	public	function peek()
	{
		if ($this->is_empty() == false)
		{
			return $this->front->element;
		}
		else
		{
			return null;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	public $root;

	function __construct()
	{
		// Set root of tree
		$this->root = null;
	}
	public	function inorder($node)
	{
		if ($node != null)
		{
			$this->inorder($node->left);
			echo "  ". $node->data;
			$this->inorder($node->right);
		}
	}
	//  Determine two trees are anagram or not
	public	function is_anagrams($root2)
	{
		// result indicators
		$status = true;
		//  Create queue variables
		$queue1 = new MyQueue();
		$queue2 = new MyQueue();
		//  Add first node of queue
		$queue1->enqueue($this->root);
		$queue2->enqueue($root2);
		//  Define tree nodes
		$node1 = null;
		$node2 = null;
		// print tree elements
		echo "\n First Tree \n";
		$this->inorder($this->root);
		echo "\n Second Tree \n";
		$this->inorder($root2);
		// 
		while ($queue1->is_empty() == false || $queue2->is_empty() == false)
		{
			if ($status == true)
			{
				//  Get the front element of both queue
				$node1 = $queue1->peek();
				$node2 = $queue2->peek();
				if (($node1 == null && $node2 != null) 
                    || ($node1 != null && $node2 == null) 
                    || ($node1 != null && $node2 != null && $node1->data != $node2->data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					$status = false;
				}
				else
				{
					if ($node1->left != null)
					{
						$queue1->enqueue($node1->left);
					}
					if ($node1->right != null)
					{
						$queue1->enqueue($node1->right);
					}
					if ($node2->right != null)
					{
						$queue2->enqueue($node2->right);
					}
					if ($node2->left != null)
					{
						$queue2->enqueue($node2->left);
					}
					$queue1->dequeue();
					$queue2->dequeue();
				}
			}
			else
			{
				if ($queue1->is_empty() == false)
				{
					$queue1->dequeue();
				}
				if ($queue2->is_empty() == false)
				{
					$queue2->dequeue();
				}
				$status = false;
			}
		}
		if ($status == false)
		{
			echo "\n Anagram not exist \n";
		}
		else
		{
			echo "\n Anagram exist \n";
		}
	}
}

function main()
{
	$tree1 = new BinaryTree();
	$tree2 = new BinaryTree();
	$tree3 = new BinaryTree();
	/*
	             8
	           /   \
	          7     4
	         /     /  \
	        3     9    2
	             / \
	            5   6   
	        ------------------ 
	        Constructing binary tree    
	        */
	$tree1->root = new TreeNode(8);
	$tree1->root->left = new TreeNode(7);
	$tree1->root->left->left = new TreeNode(3);
	$tree1->root->right = new TreeNode(4);
	$tree1->root->right->left = new TreeNode(9);
	$tree1->root->right->right = new TreeNode(2);
	$tree1->root->right->left->left = new TreeNode(5);
	$tree1->root->right->left->right = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    9    3
	            / \
	           6   5 
	        ----------------- 
	        Second Constructing binary tree 
	        */
	$tree2->root = new TreeNode(8);
	$tree2->root->right = new TreeNode(7);
	$tree2->root->right->right = new TreeNode(3);
	$tree2->root->left = new TreeNode(4);
	$tree2->root->left->right = new TreeNode(9);
	$tree2->root->left->left = new TreeNode(2);
	$tree2->root->left->right->right = new TreeNode(5);
	$tree2->root->left->right->left = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    6    3
	              \
	               9 
	                \
	                 5  
	         ----------------- 
	        Third Constructing binary tree 
	        */
	$tree3->root = new TreeNode(8);
	$tree3->root->right = new TreeNode(7);
	$tree3->root->right->right = new TreeNode(3);
	$tree3->root->left = new TreeNode(4);
	$tree3->root->left->right = new TreeNode(6);
	$tree3->root->left->left = new TreeNode(2);
	$tree3->root->left->right->right = new TreeNode(9);
	$tree3->root->left->right->right->right = new TreeNode(5);
	// inorder(tree1->root);
	//  Test case
	$tree1->is_anagrams($tree2->root);
	$tree2->is_anagrams($tree3->root);
}
main();

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
/*
    Node Js Program 
    Check if all levels of two trees are anagrams or not
*/
//  Binary Tree node
class TreeNode
{
	constructor(data)
	{
		//  Set node value
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
//  Queue Node
class QueueNode
{
	constructor(element)
	{
		this.element = element;
		this.next = null;
	}
}
// Define custom queue class
class MyQueue
{
	constructor()
	{
		this.front = null;
		this.tail = null;
	}
	// Add a new node at last of queue
	enqueue(element)
	{
		var new_node = new QueueNode(element);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	dequeue()
	{
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	is_empty()
	{
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	peek()
	{
		if (this.is_empty() == false)
		{
			return this.front.element;
		}
		else
		{
			return null;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	constructor()
	{
		// Set root of tree
		this.root = null;
	}
	inorder(node)
	{
		if (node != null)
		{
			this.inorder(node.left);
			process.stdout.write("  " + node.data);
			this.inorder(node.right);
		}
	}
	//  Determine two trees are anagram or not
	is_anagrams(root2)
	{
		// result indicators
		var status = true;
		//  Create queue variables
		var queue1 = new MyQueue();
		var queue2 = new MyQueue();
		//  Add first node of queue
		queue1.enqueue(this.root);
		queue2.enqueue(root2);
		//  Define tree nodes
		var node1 = null;
		var node2 = null;
		// print tree elements
		process.stdout.write("\n First Tree \n");
		this.inorder(this.root);
		process.stdout.write("\n Second Tree \n");
		this.inorder(root2);
		// 
		while (queue1.is_empty() == false || queue2.is_empty() == false)
		{
			if (status == true)
			{
				//  Get the front element of both queue
				node1 = queue1.peek();
				node2 = queue2.peek();
				if ((node1 == null && node2 != null) 
                    || (node1 != null && node2 == null) 
                    || (node1 != null && node2 != null && node1.data != node2.data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					status = false;
				}
				else
				{
					if (node1.left != null)
					{
						queue1.enqueue(node1.left);
					}
					if (node1.right != null)
					{
						queue1.enqueue(node1.right);
					}
					if (node2.right != null)
					{
						queue2.enqueue(node2.right);
					}
					if (node2.left != null)
					{
						queue2.enqueue(node2.left);
					}
					queue1.dequeue();
					queue2.dequeue();
				}
			}
			else
			{
				if (queue1.is_empty() == false)
				{
					queue1.dequeue();
				}
				if (queue2.is_empty() == false)
				{
					queue2.dequeue();
				}
				status = false;
			}
		}
		if (status == false)
		{
			process.stdout.write("\n Anagram not exist \n");
		}
		else
		{
			process.stdout.write("\n Anagram exist \n");
		}
	}
}

function main()
{
	var tree1 = new BinaryTree();
	var tree2 = new BinaryTree();
	var tree3 = new BinaryTree();
	/*
	             8
	           /   \
	          7     4
	         /     /  \
	        3     9    2
	             / \
	            5   6   
	        ------------------ 
	        Constructing binary tree    
	        */
	tree1.root = new TreeNode(8);
	tree1.root.left = new TreeNode(7);
	tree1.root.left.left = new TreeNode(3);
	tree1.root.right = new TreeNode(4);
	tree1.root.right.left = new TreeNode(9);
	tree1.root.right.right = new TreeNode(2);
	tree1.root.right.left.left = new TreeNode(5);
	tree1.root.right.left.right = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    9    3
	            / \
	           6   5 
	  ----------------- 
	  Second Constructing binary tree 
	 */
	tree2.root = new TreeNode(8);
	tree2.root.right = new TreeNode(7);
	tree2.root.right.right = new TreeNode(3);
	tree2.root.left = new TreeNode(4);
	tree2.root.left.right = new TreeNode(9);
	tree2.root.left.left = new TreeNode(2);
	tree2.root.left.right.right = new TreeNode(5);
	tree2.root.left.right.left = new TreeNode(6);
	/*
	             8
	           /   \
	          4     7
	         /  \    \
	        2    6    3
	              \
	               9 
	                \
	                 5  
	  ----------------------------- 
	  Third Constructing binary tree 
	 */
	tree3.root = new TreeNode(8);
	tree3.root.right = new TreeNode(7);
	tree3.root.right.right = new TreeNode(3);
	tree3.root.left = new TreeNode(4);
	tree3.root.left.right = new TreeNode(6);
	tree3.root.left.left = new TreeNode(2);
	tree3.root.left.right.right = new TreeNode(9);
	tree3.root.left.right.right.right = new TreeNode(5);

	//  Test case
	tree1.is_anagrams(tree2.root);
	tree2.is_anagrams(tree3.root);
}
main();

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
#  Python 3 Program 
#  Check if all levels of two trees are anagrams or not

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

#  Queue Node
class QueueNode :
	
	def __init__(self, element) :
		self.element = element
		self.next = None
	

# Define custom queue class
class MyQueue :
	
	def __init__(self) :
		self.front = None
		self.tail = None
	
	# Add a new node at last of queue
	def enqueue(self, element) :
		new_node = QueueNode(element)
		if (self.front == None) :
			# When first node of queue
			self.front = new_node
		else :
			# Add node at last position
			self.tail.next = new_node
		
		self.tail = new_node
	
	# Delete first node of queue
	def dequeue(self) :
		if (self.front != None) :
			if (self.tail == self.front) :
				self.tail = None
				self.front = None
			else :
				self.front = self.front.next
			
		
	
	def is_empty(self) :
		if (self.front == None) :
			return True
		else :
			return False
		
	
	def peek(self) :
		if (self.is_empty() == False) :
			return self.front.element
		else :
			return None
		
	

# Define Binary Tree 
class BinaryTree :
	
	def __init__(self) :
		# Set root of tree
		self.root = None
	
	def inorder(self, node) :
		if (node != None) :
			self.inorder(node.left)
			print("  ", node.data, end = "")
			self.inorder(node.right)
		
	
	#  Determine two trees are anagram or not 
	def is_anagrams(self, root2) :
		# result indicators
		status = True
		#  Create queue variables
		queue1 = MyQueue()
		queue2 = MyQueue()
		#  Add first node of queue
		queue1.enqueue(self.root)
		queue2.enqueue(root2)
		#  Define tree nodes
		node1 = None
		node2 = None
		# print tree elements
		print("\n First Tree \n", end = "")
		self.inorder(self.root)
		print("\n Second Tree \n", end = "")
		self.inorder(root2)
		#  
		while (queue1.is_empty() == False or queue2.is_empty() == False) :
			if (status == True) :
				#  Get the front element of both queue 
				node1 = queue1.peek()
				node2 = queue2.peek()
				if ((node1 == None and node2 != None) or(node1 != None and node2 == None) or(node1 != None and node2 != None and node1.data != node2.data)) :
					# When both queue front node are not same (That is based on values or null nodes )
					status = False
				else :
					if (node1.left != None) :
						queue1.enqueue(node1.left)
					
					if (node1.right != None) :
						queue1.enqueue(node1.right)
					
					if (node2.right != None) :
						queue2.enqueue(node2.right)
					
					if (node2.left != None) :
						queue2.enqueue(node2.left)
					
					queue1.dequeue()
					queue2.dequeue()
				
			else :
				if (queue1.is_empty() == False) :
					queue1.dequeue()
				
				if (queue2.is_empty() == False) :
					queue2.dequeue()
				
				status = False
			
		
		if (status == False) :
			print("\n Anagram not exist \n", end = "")
		else :
			print("\n Anagram exist \n", end = "")
		
	

def main() :
	tree1 = BinaryTree()
	tree2 = BinaryTree()
	tree3 = BinaryTree()
	# 
	#              8
	#            /   \
	#           7     4
	#          /     /  \
	#         3     9    2
	#              / \
	#             5   6   
	#         ------------------ 
	#         Constructing binary tree    
	#         
	
	tree1.root = TreeNode(8)
	tree1.root.left = TreeNode(7)
	tree1.root.left.left = TreeNode(3)
	tree1.root.right = TreeNode(4)
	tree1.root.right.left = TreeNode(9)
	tree1.root.right.right = TreeNode(2)
	tree1.root.right.left.left = TreeNode(5)
	tree1.root.right.left.right = TreeNode(6)
	# 
	#              8
	#            /   \
	#           4     7
	#          /  \    \
	#         2    9    3
	#             / \
	#            6   5 
	#         ----------------- 
	#         Second Constructing binary tree 
	#         
	
	tree2.root = TreeNode(8)
	tree2.root.right = TreeNode(7)
	tree2.root.right.right = TreeNode(3)
	tree2.root.left = TreeNode(4)
	tree2.root.left.right = TreeNode(9)
	tree2.root.left.left = TreeNode(2)
	tree2.root.left.right.right = TreeNode(5)
	tree2.root.left.right.left = TreeNode(6)
	# 
	#              8
	#            /   \
	#           4     7
	#          /  \    \
	#         2    6    3
	#               \
	#                9 
	#                 \
	#                  5  
	#          ----------------- 
	#         Third Constructing binary tree 
	#         
	
	tree3.root = TreeNode(8)
	tree3.root.right = TreeNode(7)
	tree3.root.right.right = TreeNode(3)
	tree3.root.left = TreeNode(4)
	tree3.root.left.right = TreeNode(6)
	tree3.root.left.left = TreeNode(2)
	tree3.root.left.right.right = TreeNode(9)
	tree3.root.left.right.right.right = TreeNode(5)
	#  Test case
	tree1.is_anagrams(tree2.root)
	tree2.is_anagrams(tree3.root)

if __name__ == "__main__": main()

Output

 First Tree
   3   7   8   5   9   6   4   2
 Second Tree
   2   4   6   9   5   8   7   3
 Anagram exist

 First Tree
   2   4   6   9   5   8   7   3
 Second Tree
   2   4   6   9   5   8   7   3
 Anagram not exist
#  Ruby Program 
#  Check if all levels of two trees are anagrams or not

#  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

#  Queue Node
class QueueNode  
	# Define the accessor and reader of class QueueNode  
	attr_reader :element, :next
	attr_accessor :element, :next
 
	
	def initialize(element) 
		self.element = element
		self.next = nil
	end

end

# Define custom queue class
class MyQueue  
	# Define the accessor and reader of class MyQueue  
	attr_reader :front, :tail
	attr_accessor :front, :tail
 
	
	def initialize() 
		self.front = nil
		self.tail = nil
	end

	# Add a new node at last of queue
	def enqueue(element) 
		new_node = QueueNode.new(element)
		if (self.front == nil) 
			# When first node of queue
			self.front = new_node
		else 
			# Add node at last position
			self.tail.next = new_node
		end

		self.tail = new_node
	end

	# Delete first node of queue
	def dequeue() 
		if (self.front != nil) 
			if (self.tail == self.front) 
				self.tail = nil
				self.front = nil
			else 
				self.front = self.front.next
			end

		end

	end

	def is_empty() 
		if (self.front == nil) 
			return true
		else 
			return false
		end

	end

	def peek() 
		if (self.is_empty() == false) 
			return self.front.element
		else 
			return nil
		end

	end

end

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

	def inorder(node) 
		if (node != nil) 
			self.inorder(node.left)
			print("  ", node.data)
			self.inorder(node.right)
		end

	end

	#  Determine two trees are anagram or not 
	def is_anagrams(root2) 
		# result indicators
		status = true
		#  Create queue variables
		queue1 = MyQueue.new()
		queue2 = MyQueue.new()
		#  Add first node of queue
		queue1.enqueue(self.root)
		queue2.enqueue(root2)
		#  Define tree nodes
		node1 = nil
		node2 = nil
		# print tree elements
		print("\n First Tree \n")
		self.inorder(self.root)
		print("\n Second Tree \n")
		self.inorder(root2)
		#  
		while (queue1.is_empty() == false || queue2.is_empty() == false) 
			if (status == true) 
				#  Get the front element of both queue 
				node1 = queue1.peek()
				node2 = queue2.peek()
				if ((node1 == nil && node2 != nil) || (node1 != nil && node2 == nil) || (node1 != nil && node2 != nil && node1.data != node2.data)) 
					# When both queue front node are not same (That is based on values or null nodes )
					status = false
				else 
					if (node1.left != nil) 
						queue1.enqueue(node1.left)
					end

					if (node1.right != nil) 
						queue1.enqueue(node1.right)
					end

					if (node2.right != nil) 
						queue2.enqueue(node2.right)
					end

					if (node2.left != nil) 
						queue2.enqueue(node2.left)
					end

					queue1.dequeue()
					queue2.dequeue()
				end

			else 
				if (queue1.is_empty() == false) 
					queue1.dequeue()
				end

				if (queue2.is_empty() == false) 
					queue2.dequeue()
				end

				status = false
			end

		end

		if (status == false) 
			print("\n Anagram not exist \n")
		else 
			print("\n Anagram exist \n")
		end

	end

end

def main() 
	tree1 = BinaryTree.new()
	tree2 = BinaryTree.new()
	tree3 = BinaryTree.new()
	# 
	#              8
	#            /   \
	#           7     4
	#          /     /  \
	#         3     9    2
	#              / \
	#             5   6   
	#         ------------------ 
	#         Constructing binary tree    
	#         
	
	tree1.root = TreeNode.new(8)
	tree1.root.left = TreeNode.new(7)
	tree1.root.left.left = TreeNode.new(3)
	tree1.root.right = TreeNode.new(4)
	tree1.root.right.left = TreeNode.new(9)
	tree1.root.right.right = TreeNode.new(2)
	tree1.root.right.left.left = TreeNode.new(5)
	tree1.root.right.left.right = TreeNode.new(6)
	# 
	#              8
	#            /   \
	#           4     7
	#          /  \    \
	#         2    9    3
	#             / \
	#            6   5 
	#         ----------------- 
	#         Second Constructing binary tree 
	#         
	
	tree2.root = TreeNode.new(8)
	tree2.root.right = TreeNode.new(7)
	tree2.root.right.right = TreeNode.new(3)
	tree2.root.left = TreeNode.new(4)
	tree2.root.left.right = TreeNode.new(9)
	tree2.root.left.left = TreeNode.new(2)
	tree2.root.left.right.right = TreeNode.new(5)
	tree2.root.left.right.left = TreeNode.new(6)
	# 
	#              8
	#            /   \
	#           4     7
	#          /  \    \
	#         2    6    3
	#               \
	#                9 
	#                 \
	#                  5  
	#          ----------------- 
	#         Third Constructing binary tree 
	#         
	
	tree3.root = TreeNode.new(8)
	tree3.root.right = TreeNode.new(7)
	tree3.root.right.right = TreeNode.new(3)
	tree3.root.left = TreeNode.new(4)
	tree3.root.left.right = TreeNode.new(6)
	tree3.root.left.left = TreeNode.new(2)
	tree3.root.left.right.right = TreeNode.new(9)
	tree3.root.left.right.right.right = TreeNode.new(5)
	#  Test case
	tree1.is_anagrams(tree2.root)
	tree2.is_anagrams(tree3.root)
end

main()

Output

 First Tree 
  3  7  8  5  9  6  4  2
 Second Tree 
  2  4  6  9  5  8  7  3
 Anagram exist 

 First Tree 
  2  4  6  9  5  8  7  3
 Second Tree 
  2  4  6  9  5  8  7  3
 Anagram not exist 
/*
    Scala Program 
    Check if all levels of two trees are anagrams or not
*/

//  Binary Tree node
class TreeNode(var data: Int , var left: TreeNode , var right: TreeNode)
{
	def this(data: Int)
	{
		this(data, null, null);
	}
}
//  Queue Node
class QueueNode(var element: TreeNode , var next: QueueNode)
{
	def this(element: TreeNode)
	{
		this(element, null);
	}
}
// Define custom queue class
class MyQueue(var front: QueueNode , var tail: QueueNode)
{
	def this()
	{
		this(null, null);
	}
	// Add a new node at last of queue
	def enqueue(element: TreeNode): Unit = {
		var new_node: QueueNode = new QueueNode(element);
		if (this.front == null)
		{
			// When first node of queue
			this.front = new_node;
		}
		else
		{
			// Add node at last position
			this.tail.next = new_node;
		}
		this.tail = new_node;
	}
	// Delete first node of queue
	def dequeue(): Unit = {
		if (this.front != null)
		{
			if (this.tail == this.front)
			{
				this.tail = null;
				this.front = null;
			}
			else
			{
				this.front = this.front.next;
			}
		}
	}
	def is_empty(): Boolean = {
		if (this.front == null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	def peek(): TreeNode = {
		if (is_empty() == false)
		{
			return this.front.element;
		}
		else
		{
			return null;
		}
	}
}
// Define Binary Tree
class BinaryTree(var root: TreeNode)
{
	def this()
	{
		this(null);
	}
	def inorder(node: TreeNode): Unit = {
		if (node != null)
		{
			inorder(node.left);
			print("  " + node.data);
			inorder(node.right);
		}
	}
	//  Determine two trees are anagram or not
	def is_anagrams(root2: TreeNode): Unit = {
		// result indicators
		var status: Boolean = true;
		//  Create queue variables
		var queue1: MyQueue = new MyQueue();
		var queue2: MyQueue = new MyQueue();
		//  Add first node of queue
		queue1.enqueue(this.root);
		queue2.enqueue(root2);
		//  Define tree nodes
		var node1: TreeNode = null;
		var node2: TreeNode = null;
		// print tree elements
		print("\n First Tree \n");
		inorder(this.root);
		print("\n Second Tree \n");
		inorder(root2);
		// 
		while (queue1.is_empty() == false || queue2.is_empty() == false)
		{
			if (status == true)
			{
				//  Get the front element of both queue
				node1 = queue1.peek();
				node2 = queue2.peek();
				if ((node1 == null && node2 != null) || (node1 != null && node2 == null) || (node1 != null && node2 != null && node1.data != node2.data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					status = false;
				}
				else
				{
					if (node1.left != null)
					{
						queue1.enqueue(node1.left);
					}
					if (node1.right != null)
					{
						queue1.enqueue(node1.right);
					}
					if (node2.right != null)
					{
						queue2.enqueue(node2.right);
					}
					if (node2.left != null)
					{
						queue2.enqueue(node2.left);
					}
					queue1.dequeue();
					queue2.dequeue();
				}
			}
			else
			{
				if (queue1.is_empty() == false)
				{
					queue1.dequeue();
				}
				if (queue2.is_empty() == false)
				{
					queue2.dequeue();
				}
				status = false;
			}
		}
		if (status == false)
		{
			print("\n Anagram not exist \n");
		}
		else
		{
			print("\n Anagram exist \n");
		}
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		var tree1: BinaryTree = new BinaryTree();
		var tree2: BinaryTree = new BinaryTree();
		var tree3: BinaryTree = new BinaryTree();
		/*
		             8
		           /   \
		          7     4
		         /     /  \
		        3     9    2
		             / \
		            5   6   
		        ------------------ 
		        Constructing binary tree    
		        */
		tree1.root = new TreeNode(8);
		tree1.root.left = new TreeNode(7);
		tree1.root.left.left = new TreeNode(3);
		tree1.root.right = new TreeNode(4);
		tree1.root.right.left = new TreeNode(9);
		tree1.root.right.right = new TreeNode(2);
		tree1.root.right.left.left = new TreeNode(5);
		tree1.root.right.left.right = new TreeNode(6);
		/*
		             8
		           /   \
		          4     7
		         /  \    \
		        2    9    3
		            / \
		           6   5 
		        ----------------- 
		        Second Constructing binary tree 
		        */
		tree2.root = new TreeNode(8);
		tree2.root.right = new TreeNode(7);
		tree2.root.right.right = new TreeNode(3);
		tree2.root.left = new TreeNode(4);
		tree2.root.left.right = new TreeNode(9);
		tree2.root.left.left = new TreeNode(2);
		tree2.root.left.right.right = new TreeNode(5);
		tree2.root.left.right.left = new TreeNode(6);
		/*
		             8
		           /   \
		          4     7
		         /  \    \
		        2    6    3
		              \
		               9 
		                \
		                 5  
		         ----------------- 
		        Third Constructing binary tree 
		        */
		tree3.root = new TreeNode(8);
		tree3.root.right = new TreeNode(7);
		tree3.root.right.right = new TreeNode(3);
		tree3.root.left = new TreeNode(4);
		tree3.root.left.right = new TreeNode(6);
		tree3.root.left.left = new TreeNode(2);
		tree3.root.left.right.right = new TreeNode(9);
		tree3.root.left.right.right.right = new TreeNode(5);
		//  Test case
		tree1.is_anagrams(tree2.root);
		tree2.is_anagrams(tree3.root);
	}
}

Output

 First Tree
  3  7  8  5  9  6  4  2
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram exist

 First Tree
  2  4  6  9  5  8  7  3
 Second Tree
  2  4  6  9  5  8  7  3
 Anagram not exist
/*
    Swift 4 Program 
    Check if all levels of two trees are anagrams or not
*/

//  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;
	}
}
//  Queue Node
class QueueNode
{
	var element: TreeNode? ;
	var next: QueueNode? ;
	init(_ element: TreeNode? )
	{
		self.element = element;
		self.next = nil;
	}
}
// Define custom queue class
class MyQueue
{
	var front: QueueNode? ;
	var tail: QueueNode? ;
	init()
	{
		self.front = nil;
		self.tail = nil;
	}
	// Add a new node at last of queue
	func enqueue(_ element: TreeNode? )
	{
		let new_node: QueueNode? = QueueNode(element);
		if (self.front == nil)
		{
			// When first node of queue
			self.front = new_node;
		}
		else
		{
			// Add node at last position
			self.tail!.next = new_node;
		}
		self.tail = new_node;
	}
	// Delete first node of queue
	func dequeue()
	{
		if (self.front != nil)
		{
			if (self.tail === self.front)
			{
				self.tail = nil;
				self.front = nil;
			}
			else
			{
				self.front = self.front!.next;
			}
		}
	}
	func is_empty()->Bool
	{
		if (self.front == nil)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	func peek()->TreeNode?
	{
		if (self.is_empty() == false)
		{
			return self.front!.element;
		}
		else
		{
			return nil;
		}
	}
}
// Define Binary Tree
class BinaryTree
{
	var root: TreeNode? ;
	init()
	{
		// Set root of tree
		self.root = nil;
	}
	func inorder(_ node: TreeNode? )
	{
		if (node != nil)
		{
			self.inorder(node!.left);
			print("  ", node!.data, terminator: "");
			self.inorder(node!.right);
		}
	}
	//  Determine two trees are anagram or not
	func is_anagrams(_ root2: TreeNode? )
	{
		// result indicators
		var status: Bool = true;
		//  Create queue variables
		let queue1: MyQueue = MyQueue();
		let queue2: MyQueue = MyQueue();
		//  Add first node of queue
		queue1.enqueue(self.root);
		queue2.enqueue(root2);
		//  Define tree nodes
		var node1: TreeNode? = nil;
		var node2: TreeNode? = nil;
		// print tree elements
		print("\n First Tree \n", terminator: "");
		self.inorder(self.root);
		print("\n Second Tree \n", terminator: "");
		self.inorder(root2);
		// 
		while (queue1.is_empty() == false || queue2.is_empty() == false)
		{
			if (status == true)
			{
				//  Get the front element of both queue
				node1 = queue1.peek();
				node2 = queue2.peek();
				if ((node1 == nil && node2 != nil) || (node1 != nil && node2 == nil) || (node1 != nil && node2 != nil && node1!.data != node2!.data))
				{
					// When both queue front node are not same (That is based on values or null nodes )
					status = false;
				}
				else
				{
					if (node1!.left != nil)
					{
						queue1.enqueue(node1!.left);
					}
					if (node1!.right != nil)
					{
						queue1.enqueue(node1!.right);
					}
					if (node2!.right != nil)
					{
						queue2.enqueue(node2!.right);
					}
					if (node2!.left != nil)
					{
						queue2.enqueue(node2!.left);
					}
					queue1.dequeue();
					queue2.dequeue();
				}
			}
			else
			{
				if (queue1.is_empty() == false)
				{
					queue1.dequeue();
				}
				if (queue2.is_empty() == false)
				{
					queue2.dequeue();
				}
				status = false;
			}
		}
		if (status == false)
		{
			print("\n Anagram not exist \n", terminator: "");
		}
		else
		{
			print("\n Anagram exist \n", terminator: "");
		}
	}
}
func main()
{
	let tree1: BinaryTree = BinaryTree();
	let tree2: BinaryTree = BinaryTree();
	let tree3: BinaryTree? = BinaryTree();
	/*
	            8
	          /   \
	         7     4
	        /     /  \
	       3     9    2
	            / \
	           5   6   
	       ------------------ 
	       Constructing binary tree    
	       */
	tree1.root = TreeNode(8);
	tree1.root!.left = TreeNode(7);
	tree1.root!.left!.left = TreeNode(3);
	tree1.root!.right = TreeNode(4);
	tree1.root!.right!.left = TreeNode(9);
	tree1.root!.right!.right = TreeNode(2);
	tree1.root!.right!.left!.left = TreeNode(5);
	tree1.root!.right!.left!.right = TreeNode(6);
	/*
	            8
	          /   \
	         4     7
	        /  \    \
	       2    9    3
	           / \
	          6   5 
	       ----------------- 
	       Second Constructing binary tree 
	       */
	tree2.root = TreeNode(8);
	tree2.root!.right = TreeNode(7);
	tree2.root!.right!.right = TreeNode(3);
	tree2.root!.left = TreeNode(4);
	tree2.root!.left!.right = TreeNode(9);
	tree2.root!.left!.left = TreeNode(2);
	tree2.root!.left!.right!.right = TreeNode(5);
	tree2.root!.left!.right!.left = TreeNode(6);
	/*
	            8
	          /   \
	         4     7
	        /  \    \
	       2    6    3
	             \
	              9 
	               \
	                5  
	        ----------------- 
	       Third Constructing binary tree 
	       */
	tree3!.root = TreeNode(8);
	tree3!.root!.right = TreeNode(7);
	tree3!.root!.right!.right = TreeNode(3);
	tree3!.root!.left = TreeNode(4);
	tree3!.root!.left!.right = TreeNode(6);
	tree3!.root!.left!.left = TreeNode(2);
	tree3!.root!.left!.right!.right = TreeNode(9);
	tree3!.root!.left!.right!.right!.right = TreeNode(5);
	//  Test case
	tree1.is_anagrams(tree2.root);
	tree2.is_anagrams(tree3!.root);
}
main();

Output

 First Tree
   3   7   8   5   9   6   4   2
 Second Tree
   2   4   6   9   5   8   7   3
 Anagram exist

 First Tree
   2   4   6   9   5   8   7   3
 Second Tree
   2   4   6   9   5   8   7   3
 Anagram not exist




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