Given a binary tree and the task if to check if its Inorder Sequence is a palindrome or not.
Examples:
Input:
Output: True
Explanation:
The Inorder sequence of the tree is “bbaaabb” which is a palindromic string.
Input:
Output: False
Explanation:
The Inorder sequence of the tree is “bbdaabb” which is not a palindromic string.
Approach:
To solve the problem, refer to the following steps:
- Convert the given Binary Tree to a Doubly Linked List.
- This, reduces the problem to Check if a doubly linked list of characters is palindrome or not.
Below is the implementation of above approach:
C++
// C++ Program to check if // the Inorder sequence of a // Binary Tree is a palindrome #include <bits/stdc++.h> using namespace std;
// Define node of tree struct node {
char val;
node* left;
node* right;
}; // Function to create the node node* newnode( char i)
{ node* temp = NULL;
temp = new node();
temp->val = i;
temp->left = NULL;
temp->right = NULL;
return temp;
} // Function to convert the tree // to the double linked list node* conv_tree(node* root, node* shoot)
{ if (root->left != NULL)
shoot = conv_tree(root->left,
shoot);
root->left = shoot;
if (shoot != NULL)
shoot->right = root;
shoot = root;
if (root->right != NULL)
shoot = conv_tree(root->right,
shoot);
return shoot;
} // Function for checking linked // list is palindrome or not int checkPalin(node* root)
{ node* voot = root;
// Count the nodes
// form the back
int j = 0;
// Set the pointer at the
// very first node of the
// linklist and count the
// length of the linklist
while (voot->left != NULL) {
j = j + 1;
voot = voot->left;
}
int i = 0;
while (i < j) {
// Check if the value matches
if (voot->val != root->val)
return 0;
else {
i = i + 1;
j = j - 1;
voot = voot->right;
root = root->left;
}
}
return 1;
} // Driver Program int main()
{ node* root = newnode( 'b' );
root->left = newnode( 'b' );
root->right = newnode( 'a' );
root->left->right = newnode( 'b' );
root->left->left = newnode( 'a' );
node* shoot = conv_tree(root, NULL);
if (checkPalin(shoot))
cout << "True" << endl;
else
cout << "False" << endl;
} |
Java
// Java Program to check if // the Inorder sequence of a // Binary Tree is a palindrome import java.util.*;
class GFG{
// Define node of tree static class node
{ char val;
node left;
node right;
}; // Function to create the node static node newnode( char i)
{ node temp = null ;
temp = new node();
temp.val = i;
temp.left = null ;
temp.right = null ;
return temp;
} // Function to convert the tree // to the double linked list static node conv_tree(node root,
node shoot)
{ if (root.left != null )
shoot = conv_tree(root.left,
shoot);
root.left = shoot;
if (shoot != null )
shoot.right = root;
shoot = root;
if (root.right != null )
shoot = conv_tree(root.right,
shoot);
return shoot;
} // Function for checking linked // list is palindrome or not static int checkPalin(node root)
{ node voot = root;
// Count the nodes
// form the back
int j = 0 ;
// Set the pointer at the
// very first node of the
// linklist and count the
// length of the linklist
while (voot.left != null )
{
j = j + 1 ;
voot = voot.left;
}
int i = 0 ;
while (i < j)
{
// Check if the value matches
if (voot.val != root.val)
return 0 ;
else
{
i = i + 1 ;
j = j - 1 ;
voot = voot.right;
root = root.left;
}
}
return 1 ;
} // Driver Code public static void main(String[] args)
{ node root = newnode( 'b' );
root.left = newnode( 'b' );
root.right = newnode( 'a' );
root.left.right = newnode( 'b' );
root.left.left = newnode( 'a' );
node shoot = conv_tree(root, null );
if (checkPalin(shoot) == 1 )
System.out.print( "True" + "\n" );
else
System.out.print( "False" + "\n" );
} } // This code is contributed by 29AjayKumar |
Python3
# Python3 program to check if # the Inorder sequence of a # Binary Tree is a palindrome # Define node of tree class Node:
def __init__( self ,val):
self .val = val
self .left = None
self .right = None
# Function to create the node def newnode(i):
#temp = None;
temp = Node(i);
temp.val = i;
temp.left = None ;
temp.right = None ;
return temp;
# Function to convert the tree # to the double linked list def conv_tree(root, shoot):
if (root.left ! = None ):
shoot = conv_tree(root.left, shoot);
root.left = shoot;
if (shoot ! = None ):
shoot.right = root;
shoot = root;
if (root.right ! = None ):
shoot = conv_tree(root.right, shoot);
return shoot;
# Function for checking linked # list is palindrome or not def checkPalin(root):
voot = root;
# Count the nodes
# form the back
j = 0 ;
# Set the pointer at the
# very first node of the
# linklist and count the
# length of the linklist
while (voot.left ! = None ):
j = j + 1 ;
voot = voot.left;
i = 0 ;
while (i < j):
# Check if the value matches
if (voot.val ! = root.val):
return 0 ;
else :
i = i + 1 ;
j = j - 1 ;
voot = voot.right;
root = root.left;
return 1 ;
# Driver code if __name__ = = '__main__' :
root = newnode( 'b' );
root.left = newnode( 'b' );
root.right = newnode( 'a' );
root.left.right = newnode( 'b' );
root.left.left = newnode( 'a' );
shoot = conv_tree(root, None );
if (checkPalin(shoot)):
print ( "True" );
else :
print ( "False" );
# This code is contributed by AbhiThakur |
C#
// C# program to check if the inorder // sequence of a Binary Tree is a // palindrome using System;
class GFG{
// Define node of tree class node
{ public char val;
public node left;
public node right;
}; // Function to create the node static node newnode( char i)
{ node temp = null ;
temp = new node();
temp.val = i;
temp.left = null ;
temp.right = null ;
return temp;
} // Function to convert the tree // to the double linked list static node conv_tree(node root,
node shoot)
{ if (root.left != null )
shoot = conv_tree(root.left,
shoot);
root.left = shoot;
if (shoot != null )
shoot.right = root;
shoot = root;
if (root.right != null )
shoot = conv_tree(root.right,
shoot);
return shoot;
} // Function for checking linked // list is palindrome or not static int checkPalin(node root)
{ node voot = root;
// Count the nodes
// form the back
int j = 0;
// Set the pointer at the
// very first node of the
// linklist and count the
// length of the linklist
while (voot.left != null )
{
j = j + 1;
voot = voot.left;
}
int i = 0;
while (i < j)
{
// Check if the value matches
if (voot.val != root.val)
return 0;
else
{
i = i + 1;
j = j - 1;
voot = voot.right;
root = root.left;
}
}
return 1;
} // Driver Code public static void Main(String[] args)
{ node root = newnode( 'b' );
root.left = newnode( 'b' );
root.right = newnode( 'a' );
root.left.right = newnode( 'b' );
root.left.left = newnode( 'a' );
node shoot = conv_tree(root, null );
if (checkPalin(shoot) == 1)
Console.Write( "True" + "\n" );
else
Console.Write( "False" + "\n" );
} } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript program to check if the inorder
// sequence of a Binary Tree is a
// palindrome
// Define node of tree
class node {
constructor() {
this .val = 0;
this .left = null ;
this .right = null ;
}
}
// Function to create the node
function newnode(i) {
var temp = null ;
temp = new node();
temp.val = i;
temp.left = null ;
temp.right = null ;
return temp;
}
// Function to convert the tree
// to the double linked list
function conv_tree(root, shoot) {
if (root.left != null ) shoot = conv_tree(root.left, shoot);
root.left = shoot;
if (shoot != null ) shoot.right = root;
shoot = root;
if (root.right != null ) shoot = conv_tree(root.right, shoot);
return shoot;
}
// Function for checking linked
// list is palindrome or not
function checkPalin(root) {
var voot = root;
// Count the nodes
// form the back
var j = 0;
// Set the pointer at the
// very first node of the
// linklist and count the
// length of the linklist
while (voot.left != null ) {
j = j + 1;
voot = voot.left;
}
var i = 0;
while (i < j) {
// Check if the value matches
if (voot.val != root.val) return 0;
else {
i = i + 1;
j = j - 1;
voot = voot.right;
root = root.left;
}
}
return 1;
}
// Driver Code
var root = newnode( "b" );
root.left = newnode( "b" );
root.right = newnode( "a" );
root.left.right = newnode( "b" );
root.left.left = newnode( "a" );
var shoot = conv_tree(root, null );
if (checkPalin(shoot) == 1) document.write( "True" + "<br>" );
else document.write( "False" + "<br>" );
// This code is contributed by rdtank.
</script>
|
Output:
True
Time Complexity: O(N)
Auxiliary Space: O(1)