/* Given two trees, return true if they are
 structurally identical */
int identicalTrees(struct node* a, struct node* b)
{
    /*1. both empty */
    if (a==NULL && b==NULL)
        return 1;
 
    /* 2. both non-empty -> compare them */
    else if (a!=NULL && b!=NULL)
   {
        return
        (
            a->data == b->data &&
            identicalTrees(a->left, b->left) &&
            identicalTrees(a->right, b->right)
        );
    }
    /* 3. one empty, one not -> false */
    else return 0;
} 
bool identicalTrees(struct node* root1, struct node* root2)
{
	if(root1==NULL&&root2==NULL)
		return true;
	
	else
	{
		if(root1==NULL)
			return false;
		if(root2==NULL)
			return false;
		if(root1->data==root2->data)
		{
			if(identicalTrees(root1->left, root2->left)&&identicalTrees(root1->right,root2->right))
				return true;
			else
				return false;		
		}
		else
			return false;
	}
}
/* Driver program to test identicalTrees function*/
int main()
{
    struct node *root1 = newNode(1);
    struct node *root2 = newNode(1);
    root1->left = newNode(2);
    root1->right = newNode(3);
    root1->left->left  = newNode(4);
    root1->left->right = newNode(5); 
 
    root2->left = newNode(2);
    root2->right = newNode(3);
    root2->left->left = newNode(4);
    root2->left->right = newNode(5); 
 
    if(identicalTrees(root1, root2))
        printf("Both tree are identical.");
    else
        printf("Trees are not identical.");
 
    getchar();
  return 0;
}